multiset

[機能]

  同じ値を持つ要素許す set です.Comp に対しては,比較を行う二項関数オブジェクト名を指定します.指定しないと less (昇順)が選択されます.( STL )
template <class Key, class Comp = less<Key>, class Allocator = allocator<Key> > class multiset
		

[使用方法]
#include <set>
using namespace std;
multiset <Key, Comp> 変数名;
		
[メンバー関数等]

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

[使用例]

  1. multiset の使用方法です.
    #include <stdio.h>
    #include <set>
    using namespace std;
    
    void print(char *str, multiset<int> &s) {
    	if (s.empty())
    		printf("  コンテナ %s は空です\n", str);
    	else {
    		multiset<int>::iterator it;
    		printf("%s の要素数: %d\n", str, s.size());
    		for (it = s.begin(); it != s.end(); it++)
    			printf("  %d", *it);
    		printf("\n");
    	}
    }
    
    int main()
    {
    	multiset<int> s1, s2;
    	multiset<int>::iterator it;
    					// 要素を追加(サイズは自動的に増加)
    	printf("**初期設定**\n");
    	s1.insert(2);
    	s1.insert(0);
    	s1.insert(0);
    	s1.insert(0);
    	s1.insert(2);
    	print("s1", s1);
    					// 2 番目の要素の前に要素を追加
    	printf("**2 番目の要素の前に要素を追加**\n");
    	it = s1.begin();
    	it++;
    	s1.insert(it, 5);
    	print("s1", s1);
    					// 3 番目の要素,及び,要素 2 を削除
    	printf("**3 番目の要素,及び,要素 2 を削除**\n");
    	it = s1.begin();
    	it++;
    	it++;
    	s1.erase(it);
    	s1.erase(2);
    	print("s1", s1);
    					// 要素 0 の位置
    	printf("**要素 0 の位置**\n");
    	int n = s1.count(0);
    	printf("0 の検索: 数 = %d\n", n);
    	for (it = s1.lower_bound(0); it != s1.upper_bound(0); it++)
    		printf("  %d", *it);
    	printf("\n");
    					// 交換
    	printf("**交換**\n");
    	print("入れ替え前:s1", s1);
    	print("入れ替え前:s2", s2);
    	s1.swap(s2);
    	print("s1", s1);
    	print("s2", s2);
    					// 演算子で比較
    	printf("**比較**\n");
    	s1.insert(0);
    	s1.insert(5);
    	s1.insert(0);
    	print("s1", s1);
    	if (s1 == s2)
    		printf("  2 つのコンテナ内の要素はすべて等しい\n");
    					// すべての要素を削除
    	printf("**s1 のすべての要素を削除**\n");
    	s1.clear();
    	print("s1", s1);
    
    	return 0;
    }
    			
    (出力)
    **初期設定**
    s1 の要素数: 5
      0  0  0  2  2
    **2 番目の要素の前に要素を追加**
    s1 の要素数: 6
      0  0  0  2  2  5
    **3 番目の要素,及び,要素 2 を削除**
    s1 の要素数: 3
      0  0  5
    **要素 0 の位置**
    0 の検索: 数 = 2
      0  0
    **交換**
    入れ替え前:s1 の要素数: 3
      0  0  5
      コンテナ 入れ替え前:s2 は空です
      コンテナ s1 は空です
    s2 の要素数: 3
      0  0  5
    **比較**
    s1 の要素数: 3
      0  0  5
      2 つのコンテナ内の要素はすべて等しい
    **s1 のすべての要素を削除**
      コンテナ s1 は空です
    			
  2. multiset の使用方法です.クラス Test における 2 つの整数値の和が大きい順に並べ替えています.
    #include <iostream>
    #include <set>
    #include <string>
    using namespace std;
    
    class Test {
    	public:
    		string str;
    		int n1, n2;
    		Test (string str1, int m1, int m2) {
    			str = str1;
    			n1  = m1;
    			n2  = m2;
    		}
    };
    					// 二項関数オブジェクト
    class GT
    {
    	public:
    		bool operator() (Test t1, Test t2)
    		{
    			if (t1.n1+t1.n2 == t2.n1+t2.n2)
    				return (t1.str > t2.str) ? true : false;
    			else
    				return (t1.n1+t1.n2 > t2.n1+t2.n2) ? true : false;
    		}
    };
    					// < 演算子のオーバーロード
    //bool operator< (Test t1, Test t2)
    //{
    //	if (t1.n1+t1.n2 == t2.n1+t2.n2)
    //		return (t1.str > t2.str) ? true : false;
    //	else
    //		return (t1.n1+t1.n2 > t2.n1+t2.n2) ? true : false;
    //}
    
    int main()
    {
    	Test t1("abc", 20, 30), t2("xyz", 30, 10), t3("ghq", 40, 50), t4("yyy", 30, 10);
    					// 二項関数オブジェクトを利用する場合
    	multiset<Test, GT> s;
    	multiset<Test, GT>::iterator it;
    					// < 演算子のオーバーロードを利用する場合
    //	multiset<Test> s;
    //	multiset<Test>::iterator it;
    					// 要素を追加
    	s.insert(t1);
    	s.insert(t2);
    	s.insert(t2);
    	s.insert(t4);
    	s.insert(t3);
    					// 出力
    	for (it = s.begin(); it != s.end(); it++)
    		cout << (*it).str << " " << (*it).n1 << " " << (*it).n2 << endl;
    
    	return 0;
    }
    			
    (出力)
    ghq 40 50
    abc 20 30
    yyy 30 10
    xyz 30 10
    xyz 30 10
    			
[参照]

setmultimapbitsetdequelistmappairpriority_queuequeuestackstringvector

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