#include <iostream>
#include <unordered_map>
using namespace std;
using itr = unordered_multimap<string, int>::iterator;
void print(string str, unordered_multimap<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_multimap<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_multimap<string, int> m1;
m1.insert(pair<string, int>("suzuki", 40));
m1.insert(pair<string, int>("sato", 60));
m1.insert(pair<string, int>("suzuki", 70));
m1.insert(pair<string, int>("suzuki", 50));
m1.insert(pair<string, int>("kato", 90));
print("m1", m1);
// 2 番目の要素の前に要素を追加
cout << "**2 番目の要素の前に要素を追加**\n";
unordered_multimap<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("kato");
print("m1", m1);
// キー suzuki の値
cout << "**キー suzuki の値**\n";
it = m1.find("suzuki");
cout << " 値: " << it->second << endl; // 最初のデータ
pair<itr, itr> x = m1.equal_range("suzuki");
for (it = x.first; it != x.second; it++)
cout << " (" << (*it).first << ", " << (*it).second << ")";
cout << endl;
// 演算子で比較
cout << "**比較**\n";
unordered_multimap<string, int> m2 = {{"naito", 20}, {"suzuki", 50},
{"suzuki", 70}, {"suzuki", 40}};
print("m2", m2);
if (m1 == m2)
cout << " 2 つのコンテナ内の要素はすべて等しい\n";
// 要素 suzuki を削除
m1.erase("suzuki");
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;
}