template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>, class Allocator = allocator<pair<const Key, T>>> class unordered_map;
#include <unordered_map> using namespace std; unordered_map <Key, T> 変数名; unordered_map<int, string> x; // 空の unordered_map,昇順 unordered_map<int, string> x(it1, it2); // it1 から it2 の範囲で初期化 unordered_map<int, string> x(y); // unordered_map y で初期化 unordered_map<int, string> x ({{3, "abc"}, {1, "xyz"}, {2, "efg"}}); // 初期化子リスト unordered_map<int, string> x {{3, "abc"}, {1, "xyz"}, {2, "efg"}}; // 初期化子リスト unordered_map<int, string> x = {{3, "abc"}, {1, "xyz"}, {2, "efg"}}; // 初期化子リスト
unordered_map<int, string> mp {{1, "abc"}, {3, "efg"}}; mp.emplace(0, "xxx"); mp.emplace(make_pair(4, "yyy")); // mp.insert(2, "xyz"); // error mp.insert(make_pair(2, "xyz")); for (auto x : mp) cout << " (" << x.first << ", " << x.second << ")"; cout << endl;
= == != []
#include <iostream> #include <unordered_map> using namespace std; void print(string str, unordered_map<string, int> &m) { if (m.empty()) cout << " コンテナ " << str << " は空です\n"; else { cout << str << " の要素数: " << m.size() << endl; for (auto x : m) cout << " " << x.first << " " << x.second; // unordered_map<string, int>::iterator it; // for (it = m.begin(); it != m.end(); it++) // cout << " " << (*it).first << " " << (*it).second; cout << endl; } } int main() { // 要素を追加,キーが string,値が int cout << "**初期設定**\n"; unordered_map<string, int> m1; m1.insert(pair<string, int>("suzuki", 40)); m1.insert(pair<string, int>("sato", 60)); m1.insert(pair<string, int>("yamada", 70)); m1.insert(pair<string, int>("tanaka", 50)); m1.insert(pair<string, int>("kato", 90)); print("m1", m1); // 2 番目の要素の前に要素を追加 cout << "**2 番目の要素の前に要素を追加**\n"; unordered_map<string, int>::iterator it = m1.begin(); it++; m1.insert(it, pair<string, int>("naito", 20)); print("m1", m1); // 2 番目の要素,及び,要素 naito を削除 cout << "**2 番目の要素,及び,要素 tanaka を削除**\n"; it = m1.begin(); it++; m1.erase(it); m1.erase("tanaka"); print("m1", m1); // キー suzuki の値 cout << "**キー suzuki の値**\n"; it = m1.find("suzuki"); cout << " 値: " << it->second << endl; cout << " 値: " << m1.at("suzuki") << endl; cout << " 値: " << m1["suzuki"] << endl; // 演算子で比較 cout << "**比較**\n"; unordered_map<string, int> m2 = {{"naito", 20}, {"suzuki", 40}, {"yamada", 70}, {"kato", 90}}; print("m2", m2); if (m1 == m2) cout << " 2 つのコンテナ内の要素はすべて等しい\n"; // ヒントと insert_or_assign,try_emplace cout << "ヒントと insert_or_assign\n"; m1.emplace_hint(m1.begin(), "wada", 10); // 先頭近傍に挿入されることが既知 print("m1", m1); pair<unordered_map<string, int>::iterator, bool> p; p = m1.insert_or_assign("wada", 20); cout << "存在した場合(insert_or_assign) " << (*p.first).second << " " << p.second << " "; print("m1", m1); p = m1.try_emplace("wada", 100); cout << "存在した場合(try_emplace) " << (*p.first).second << " " << p.second << " "; print("m1", m1); p = m1.insert_or_assign("aoki", 50); cout << "存在しなかった場合(insert_or_assign) " << (*p.first).second << " " << p.second << " "; print("m1", m1); // [] 演算子( ["tanaka"] ) cout << "**[] 演算子( [\"tanaka\"] )**\n"; cout << m1["tanaka"] << endl; // 参照した時点で追加される // cout << m1.at("tanaka") << endl; // キーが存在しないときは out_of_range 例外 print("m1", m1); m1["tanaka"] = 100; print("m1", m1); // 交換 cout << "**交換**\n"; print("入れ替え前:m1", m1); print("入れ替え前:m2", m2); m1.swap(m2); print("m1", m1); print("m2", m2); // m1 のすべての要素を削除 cout << "**m1 のすべての要素を削除**\n"; m1.clear(); print("m1", m1); return 0; }
**初期設定** m1 の要素数: 5 kato 90 tanaka 50 yamada 70 suzuki 40 sato 60 **2 番目の要素の前に要素を追加** m1 の要素数: 6 naito 20 sato 60 suzuki 40 yamada 70 tanaka 50 kato 90 **2 番目の要素,及び,要素 tanaka を削除** m1 の要素数: 4 naito 20 suzuki 40 yamada 70 kato 90 **キー suzuki の値** 値: 40 値: 40 値: 40 **比較** m2 の要素数: 4 kato 90 suzuki 40 yamada 70 naito 20 2 つのコンテナ内の要素はすべて等しい ヒントと insert_or_assign m1 の要素数: 5 wada 10 naito 20 suzuki 40 yamada 70 kato 90 存在した場合(insert_or_assign) 20 0 m1 の要素数: 5 wada 20 naito 20 suzuki 40 yamada 70 kato 90 存在した場合(try_emplace) 20 0 m1 の要素数: 5 wada 20 naito 20 suzuki 40 yamada 70 kato 90 存在しなかった場合(insert_or_assign) 50 1 m1 の要素数: 6 wada 20 naito 20 suzuki 40 yamada 70 aoki 50 kato 90 **[] 演算子( ["tanaka"] )** 0 m1 の要素数: 7 tanaka 0 wada 20 naito 20 suzuki 40 yamada 70 aoki 50 kato 90 m1 の要素数: 7 tanaka 100 wada 20 naito 20 suzuki 40 yamada 70 aoki 50 kato 90 **交換** 入れ替え前:m1 の要素数: 7 tanaka 100 wada 20 naito 20 suzuki 40 yamada 70 aoki 50 kato 90 入れ替え前:m2 の要素数: 4 kato 90 suzuki 40 yamada 70 naito 20 m1 の要素数: 4 kato 90 suzuki 40 yamada 70 naito 20 m2 の要素数: 7 tanaka 100 wada 20 naito 20 suzuki 40 yamada 70 aoki 50 kato 90 **m1 のすべての要素を削除** コンテナ m1 は空です
菅沼ホーム | 本文目次 | 演習問題解答例 | 付録目次 | 索引 |