multimap

[機能]

  同じキーを持つデータ(キーの重複)を許す map です.Comp に対しては,比較を行う二項関数オブジェクト名を指定します.指定しないと less (昇順)が選択されます.( STL )
template <class Key, class T, class Comp = less<Key>, class Allocator = allocator<Key> > class multimap
		

[使用方法]
#include <map>
using namespace std;
multimap <Key, T, Comp> 変数名;
		

[メンバー関数等]

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

[使用例]

  1. multimap の使用方法です.キーとして char* を使用することも可能ですが,ソートがポインタを対象として行われるため,期待した順序で並べ替えることができません.
    #include <iostream>
    #include <map>
    using namespace std;
    
    void print(char *str, multimap<string, int, greater<string> > &m) {
    	if (m.empty())
    		cout << "  コンテナ " << str << " は空です\n";
    	else {
    		multimap<string, int, greater<string> >::iterator it;
    		cout << str << " の要素数: " << m.size() << endl;
    		for (it = m.begin(); it != m.end(); it++)
    			cout << "  " << (*it).first << " " << (*it).second;
    		cout << endl;
    	}
    }
    
    int main()
    {
    	multimap<string, int, greater<string> > m1, m2;   // キーが string,値が int,大きい順にソート
    	multimap<string, int, greater<string> >::iterator it;
    					// 要素を追加(サイズは自動的に増加)
    	cout << "**初期設定**\n";
    	m1.insert(pair<string, int>("kato", 80));
    	m1.insert(pair<string, int>("sato", 50));
    	m1.insert(pair<string, int>("sato", 30));
    	m1.insert(pair<string, int>("sato", 70));
    	m1.insert(pair<string, int>("kato", 90));
    	print("m1", m1);
    					// 2 番目の要素の前に要素を追加
    	cout << "**2 番目の要素の前に要素を追加**\n";
    	it = m1.begin();
    	it++;
    	m1.insert(it, pair<string, int>("suzuki", 20));
    	print("m1", m1);
    					// 2 番目の要素,及び,要素 kato を削除
    	cout << "**2 番目の要素,及び,要素 kato を削除**\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;
    					// キー sato の要素
    	cout << "**キー sato の要素**\n";
    	int n = m1.count("sato");
    	cout <<"  sato の検索: 数 = " << n << endl;
    	for (it = m1.lower_bound("sato"); it != m1.upper_bound("sato"); it++)
    		cout << "  " << (*it).first << " " << (*it).second;
    	cout << endl;
    					// 交換
    	cout << "**交換**\n";
    	print("入れ替え前:m1", m1);
    	print("入れ替え前:m2", m2);
    	m1.swap(m2);
    	print("m1", m1);
    	print("m2", m2);
    					// 演算子で比較
    	cout << "**比較++\n";
    	m1.insert(pair<string, int>("sato", 30));
    	m1.insert(pair<string, int>("sato", 70));
    	m1.insert(pair<string, int>("suzuki", 20));
    	print("m1", m1);
    	if (m1 == m2)
    		cout << "  2 つのコンテナ内の要素はすべて等しい\n";
    					// m1 のすべての要素を削除
    	cout << "**m1 のすべての要素を削除**\n";
    	m1.clear();
    	print("m1", m1);
    
    	return 0;
    }
    			
    (出力)
    **初期設定**
    m1 の要素数: 5
      sato 50  sato 30  sato 70  kato 80  kato 90
    **2 番目の要素の前に要素を追加**
    m1 の要素数: 6
      suzuki 20  sato 50  sato 30  sato 70  kato 80  kato 90
    **2 番目の要素,及び,要素 kato を削除**
    m1 の要素数: 3
      suzuki 20  sato 30  sato 70
    **キー suzuki の値**
    検索: 20
    **キー sato の要素**
      sato の検索: 数 = 2
      sato 30  sato 70
    **交換**
    入れ替え前:m1 の要素数: 3
      suzuki 20  sato 30  sato 70
      コンテナ 入れ替え前:m2 は空です
      コンテナ m1 は空です
    m2 の要素数: 3
      suzuki 20  sato 30  sato 70
    **比較++
    m1 の要素数: 3
      suzuki 20  sato 30  sato 70
      2 つのコンテナ内の要素はすべて等しい
    **m1 のすべての要素を削除**
      コンテナ m1 は空です
    			
  2. multimap の使用方法です.クラス Test における整数値の和が大きい順にソートしています.
    #include <iostream>
    #include <map>
    #include <string>
    using namespace std;
    
    class Test {
    	public:
    		int n1, n2;
    		Test (int m1, int m2) {
    			n1 = m1;
    			n2 = m2;
    		}
    };
    					// 二項関数オブジェクト
    class GT
    {
    	public:
    		bool operator() (Test t1, Test t2)
    		{
    			return (t1.n1+t1.n2 > t2.n1+t2.n2) ? true : false;
    		}
    };
    					// < 演算子のオーバーロード
    //bool operator< (Test t1, Test t2)
    //{
    //	return (t1.n1+t1.n2 > t2.n1+t2.n2) ? true : false;
    //}
    
    int main()
    {
    	Test t1(20, 30), t2(30, 10), t3(40, 50);
    					// 二項関数オブジェクトを利用する場合
    	multimap<Test, string, GT> s;
    	multimap<Test, string, GT>::iterator it;
    					// < 演算子のオーバーロードを利用する場合
    //	multimap<Test, string> s;
    //	multimap<Test, string>::iterator it;
    					// 要素を追加
    	s.insert(pair<Test, string>(t1, "abc"));
    	s.insert(pair<Test, string>(t2, "kkk"));
    	s.insert(pair<Test, string>(t2, "kkk"));
    	s.insert(pair<Test, string>(t3, "xyz"));
    					// 出力
    	for (it = s.begin(); it != s.end(); it++)
    		cout << (*it).second << endl;
    
    	return 0;
    }
    			
    (出力)
    xyz
    abc
    kkk
    kkk
    			
[参照]

setbitsetdequelistmapmultisetpairpriority_queuequeuestackstringvector

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