unordered_multimap クラスC++11

[機能]

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

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

[使用方法]
#include <unordered_map>
using namespace std;
unordered_multimap <Key, T> 変数名;
   unordered_multimap<int, string> x;   // 空の unordered_map,昇順
   unordered_multimap<int, string> x(it1, it2);   // it1 から it2 の範囲で初期化
   unordered_multimap<int, string> x(y);   // unordered_map y で初期化
   unordered_multimap<int, string> x ({{3, "abc"}, {2, "xyz"}, {2, "efg"}});   // 初期化子リスト
   unordered_multimap<int, string> x {{3, "abc"}, {2, "xyz"}, {2, "efg"}};   // 初期化子リスト
   unordered_multimap<int, string> x = {{3, "abc"}, {2, "xyz"}, {2, "efg"}};   // 初期化子リスト		

[メンバー関数等]

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

[使用例]

  1. unordered_multimap の使用方法です.以下に示すプログラム例において,いくつかのコメント部分は,その上または下に記述された方法とほぼ同等なものであることを示しています(複数行の対応関係である場合もある).
    #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;
    }
    			
    (出力)
    **初期設定**
    m1 の要素数: 5
      kato 90  suzuki 50  suzuki 70  suzuki 40  sato 60
    **2 番目の要素の前に要素を追加**
    m1 の要素数: 6
      naito 20  sato 60  suzuki 50  suzuki 70  suzuki 40  kato 90
    **2 番目の要素,及び,要素 tanaka を削除**
    m1 の要素数: 4
      naito 20  suzuki 50  suzuki 70  suzuki 40
    **キー suzuki の値**
      値: 50
     (suzuki, 50) (suzuki, 70) (suzuki, 40)
    **比較**
    m2 の要素数: 4
      suzuki 40  suzuki 70  suzuki 50  naito 20
      2 つのコンテナ内の要素はすべて等しい
    m1 の要素数: 1
      naito 20
    **交換**
    入れ替え前:m1 の要素数: 1
      naito 20
    入れ替え前:m2 の要素数: 4
      suzuki 40  suzuki 70  suzuki 50  naito 20
    m1 の要素数: 4
      suzuki 40  suzuki 70  suzuki 50  naito 20
    m2 の要素数: 1
      naito 20
    **m1 のすべての要素を削除**
      コンテナ m1 は空です
    			
[参照]

vectorsetmultimaparrayforward_listlistmultisetpriority_queuequeuestackdequemapunordered_mapunordered_setunordered_multiset

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