#include <iostream>
#include <unordered_set>
using namespace std;
using itr = unordered_multiset<int>::iterator;
void print(string str, unordered_multiset<int> &s) {
if (s.empty())
cout << "コンテナ " << str << " は空です\n";
else {
cout << str << " の要素数: " << s.size() << endl;
for (auto x : s)
cout << " " << x;
// unordered_multiset<int>::iterator it;
// for (it = s.begin(); it != s.end(); it++)
// cout << " " << *it;
cout << endl;
}
}
int main()
{
// 初期設定
cout << "**初期設定**\n";
unordered_multiset<int> s1 = {1, 5, 0, 0, 3, 0, 0};
print("s1", s1);
// 2 番目の要素の前に要素を追加
cout << "**2 番目の要素の前に要素を追加**\n";
unordered_multiset<int>::iterator it = s1.begin();
it++;
s1.insert(it, 5);
print("s1", s1);
// 3 番目の要素,及び,要素 5 を削除
cout << "**3 番目の要素,及び,要素 5 を削除**\n";
it = s1.begin();
it++;
it++;
s1.erase(it);
s1.erase(5);
print("s1", s1);
// 要素 0 の位置
cout << "**要素 0 の位置**\n";
it = s1.find(0);
printf(" イテレータの示す値: %d\n", *it);
pair<itr, itr> x = s1.equal_range(0);
printf(" 全ての要素");
for (it = x.first; it != x.second; it++)
cout << " " << *it;
cout << endl;
// 交換
cout << "**交換**\n";
unordered_multiset<int> s2;
cout << "入れ替え前:\n";
print("s1", s1);
print("s2", s2);
s1.swap(s2);
cout << "入れ替え後:\n";
print("s1", s1);
print("s2", s2);
// 演算子で比較
cout << "**比較**\n";
s1.insert(1);
s1.insert(3);
s1.insert(0);
s1.insert(0);
s1.insert(0);
s1.insert(0);
print("s1", s1);
if (s1 == s2)
cout << " 2 つのコンテナ内の要素はすべて等しい\n";
// s1 のすべての要素を削除
cout << "**s1 のすべての要素を削除**\n";
s1.clear();
print("s1", s1);
return 0;
}