unordered_multiset クラスC++11

[機能]

  標準の配列や vector とは異なり,コンテナ内の要素へのアクセスは絶対的な位置(添え字)によるのではなく、キーによります.コンテナ内の各要素は,キーのハッシュ値に基づきハッシュテーブルに格納されるため,決められた順序で並んでいるわけではありません.キーそのものが要素でもあり,かつ,同一のキー値を格納することができます.

  ハッシュ法において,データが格納される配列のことをハッシュ表(ハッシュテーブル)と呼び,ハッシュ表の各要素をバケットと呼びます.unordered_map クラスには,ハッシュ表やバケットに関する情報を得るための関数も存在しますが,ここでは省略します.また,以下に示す関数において,一般に,insert よりも,emplace を使ったほうが処理効率は良くなります.
template <class Key, class Hash = std::hash<Key>,
class Pred = std::equal_to<Key>, class Allocator = std::allocator<Key>>
    class unordered_multiset		

[使用方法]
#include <unordered_multiset>
using namespace std;
unordered_multiset <Key> 変数名;
   unordered_multiset<int> x;   // 空の unordered_multiset,昇順
   unordered_multiset<int> x(it1, it2);   // it1 から it2 の範囲で初期化
   unordered_multiset<int> x(y);   // unordered_multiset y で初期化
   unordered_multiset<int> x ({2, 4, 4, 1});   // 初期化子リスト
   unordered_multiset<int> x {2, 4, 4, 1};   // 初期化子リスト
   unordered_multiset<int> x = {2, 4, 4, 1};   // 初期化子リスト		
[メンバー関数等]

[演算子の多重定義]
=  ==  !=		

[使用例]

  1. unordered_multiset の使用方法です.以下に示すプログラム例において,いくつかのコメント部分は,その上または下に記述された方法とほぼ同等なものであることを示しています(複数行の対応関係である場合もある).
    #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;
    }
    			
    (出力)
    **初期設定**
    s1 の要素数: 7
      3  0  0  0  0  5  1
    **2 番目の要素の前に要素を追加**
    s1 の要素数: 8
      1  5  5  0  0  0  0  3
    **3 番目の要素,及び,要素 5 を削除**
    s1 の要素数: 6
      1  0  0  0  0  3
    **要素 0 の位置**
      イテレータの示す値: 0
      全ての要素 0 0 0 0
    **交換**
    入れ替え前:
    s1 の要素数: 6
      1  0  0  0  0  3
    コンテナ s2 は空です
    入れ替え後:
    コンテナ s1 は空です
    s2 の要素数: 6
      1  0  0  0  0  3
    **比較**
    s1 の要素数: 6
      3  1  0  0  0  0
      2 つのコンテナ内の要素はすべて等しい
    **s1 のすべての要素を削除**
    コンテナ s1 は空です
    			
[参照]

vectormapmultimaparrayforward_listlistmultisetpriority_queuequeuestackdequeunordered_mapunordered_multimapsetunordered_set

菅沼ホーム 本文目次 演習問題解答例 付録目次 索引