C++ の STL マップに新しい要素を挿入する

胡金庫 2023年10月12日
  1. insert メンバー関数を使用して、C++ の std::map に新しい要素を追加する
  2. insert_or_assign メンバー関数を使用して、C++ の std::map に新しい要素を追加する
  3. emplace メンバー関数を使用して、C++ の std::map に新しい要素を追加する
  4. emplace_hint メンバー関数を使用して、C++ の std::map に新しい要素を追加する
C++ の STL マップに新しい要素を挿入する

この記事では、C++ の std::map オブジェクトに新しい要素を追加する方法の複数の方法について説明します。

insert メンバー関数を使用して、C++ の std::map に新しい要素を追加する

STL map コンテナは、キーと値のペアを要素として格納するためのデータ構造を提供し、挿入または初期化時に自動的にソートされます。新しい要素は、いくつかのメソッドを使用して std::map オブジェクトに追加できますが、最も一般的なのは insert 関数です。

insert メンバー関数には複数のオーバーロードがあります。それでも、最も単純なものは、挿入されたオブジェクトへの const 参照を指定する単一の引数のみを取ります。次のサンプルコードに示すように、別のオーバーロードは r 値参照を受け入れ、std::forward コマンドを使用して要素をインプレースで構築できます。

後者のオーバーロードは、挿入された要素へのイテレータと bool 値のペアを返し、挿入が成功したことを示します。また、初期化子リストと同様のキー値のリストを取得し、値から要素を構築する insert 関数のオーバーロードについても説明します。ただし、このオーバーロードにはリターンタイプはありません。

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
using std::string;

template <typename Map>
void printMap(Map& m) {
  for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
  cout << endl;
}

int main() {
  std::map<string, string> m1 = {
      {"h", "htop"},
      {"k", "ktop"},
  };

  auto ret = m1.insert({"k", "ktop"});
  ret.second ? cout << "Inserted" : cout << "Not Inserted";
  cout << "\n";

  m1.insert({{"k", "ktop"}, {"p", "ptop"}});
  printMap(m1);

  return EXIT_SUCCESS;
}

出力:

Not Inserted
h : htop;
k : ktop;
p : ptop;

insert_or_assign メンバー関数を使用して、C++ の std::map に新しい要素を追加する

新しい C++ 17 標準は、insert_or_assign と呼ばれるメンバー関数を提供します。この関数は、指定されたキーがまだ存在しない場合に、マップに新しい要素を挿入します。それ以外の場合、関数は既存のキーを持つ要素に新しい値を割り当てます。

関数にはいくつかのオーバーロードがありますが、次の例で呼び出されるものは、キーと値への r 値参照として 2つの引数を取ります。このオーバーロードは、イテレータと bool 値のペアも返します。条件演算子を使用して挿入のステータスを確認し、対応するメッセージを出力することに注意してください。

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
using std::string;

template <typename Map>
void printMap(Map& m) {
  for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
  cout << endl;
}

int main() {
  std::map<string, string> m1 = {
      {"h", "htop"},
      {"k", "ktop"},
  };

  auto ret = m1.insert_or_assign("p", "ptop");
  ret.second ? cout << "Inserted" : cout << "Assigned";
  cout << "\n";

  ret = m1.insert_or_assign("t", "ttop");
  ret.second ? cout << "Inserted" : cout << "Assigned";
  cout << "\n";

  printMap(m1);

  return EXIT_SUCCESS;
}

出力:

Inserted
Inserted
h : htop;
k : ktop;
p : ptop;
t : ttop;

emplace メンバー関数を使用して、C++ の std::map に新しい要素を追加する

std::map コンテナで提供されるもう 1つのメンバー関数は、emplace です。この関数は、引数値をコピーする必要がないため、insert 関数とは対照的に効率を提供します。逆に、emplace 関数は要素をインプレースで構築します。つまり、指定されたパラメーターはクラスコンストラクターに転送されます。引数に応じて、対応するコンストラクターが呼び出されることに注意してください。

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
using std::string;

template <typename Map>
void printMap(Map& m) {
  for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
  cout << endl;
}

int main() {
  std::map<string, string> m1 = {
      {"h", "htop"},
      {"k", "ktop"},
  };

  auto ret = m1.emplace("t", "ttop");
  ret.second ? cout << "Inserted" : cout << "Not Inserted";
  cout << endl;

  ret = m1.emplace(std::make_pair("t", "ttop"));
  ret.second ? cout << "Inserted" : cout << "Not Inserted";
  cout << endl;

  printMap(m1);

  return EXIT_SUCCESS;
}

出力:

Inserted
Not Inserted
h : htop;
k : ktop;
t : ttop;

emplace_hint メンバー関数を使用して、C++ の std::map に新しい要素を追加する

または、emplace_hint メンバー関数を使用して、操作が検索を開始する位置を指定する hint と呼ばれる追加パラメーターを使用して新しい要素をマップに挿入することもできます。プロセスが成功した場合、新しく挿入された要素にイテレータを返します。それ以外の場合は、同じキーを持つ既存の要素へのイテレータが返されます。

#include <iostream>
#include <map>

using std::cout;
using std::endl;
using std::map;
using std::string;

template <typename Map>
void printMap(Map& m) {
  for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
  cout << endl;
}

int main() {
  std::map<string, string> m1 = {
      {"h", "htop"},
      {"k", "ktop"},
  };

  auto ret = m1.emplace_hint(m1.begin(), "t", "ttop");

  m1.emplace_hint(ret, "m", "mtop");
  m1.emplace_hint(m1.begin(), "p", "ptop");

  printMap(m1);

  return EXIT_SUCCESS;
}

出力:

h : htop;
k : ktop;
m : mtop;
p : ptop;
t : ttop;
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Map