C++ の STL マップに新しい要素を挿入する
-
insert
メンバー関数を使用して、C++ のstd::map
に新しい要素を追加する -
insert_or_assign
メンバー関数を使用して、C++ のstd::map
に新しい要素を追加する -
emplace
メンバー関数を使用して、C++ のstd::map
に新しい要素を追加する -
emplace_hint
メンバー関数を使用して、C++ のstd::map
に新しい要素を追加する
この記事では、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;