#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;
}