トップ-> C++入門:7章 STL-> mutiset

←前ページへ :  トップへ :  次ページへ→


  multisetは、int型などの標準で用意されている型を使用した場合には、ただのソートしながら 追加するだけのコンテナです。multisetが便利なのは、自分で用意したクラスを使用する場合で、 なおかつ、operator<を使用した場合です。

  ここではmultisetを使った名簿の例を示します。
// STLを使うとwarningが出る可能性があるので、それを出さないようにする
#pragma warning (disable:4786)

#include<set>
#include<iostream>
#include <iomanip>
#include"String.h"     // 04-19で作ったもの
using namespace std;

// 本クラス
class Book{
public:
    // デフォルトコンストラクタ
    Book() : 
        Author( "" ),
        Title( "" )  {}
    // コンストラクタ
    Book(String author) :
        Author( author ),
        Title( "" ) {}
    // コンストラクタ
    Book(String author, String title) :
        Author( author ),
        Title( title ){}

    // 比較演算子
    bool operator<(const Book& a)const{
        return Author < a.Author;
    }

    // メンバー変数
    String Author;
    String Title;
};

void main(){
    cout << setiosflags( ios::left ) << flush;

    // setを宣言
    multiset<Book> s;

    // データ追加
    s.insert(Book("石橋",   "C言語入門") );
    s.insert(Book("石橋",   "アセンブラ入門") );
    s.insert(Book("石橋",   "C++入門") );
    s.insert(Book("中島",   "夜会") );
    s.insert(Book("つんく", "モーニング娘。のすべて") );

    cout << setiosflags( ios::left ) << flush;

    // すべてを表示
    multiset<Book>::iterator itr    = s.begin();
    multiset<Book>::iterator itrEnd = s.end();
    for( ; itr != itrEnd ; itr++ )
        cout << setw(20) << itr->Author << setw(20) << itr->Title << endl;

    cout << endl;

    // 著者が石橋のものを表示
    pair<multiset<Book>::iterator, multiset<Book>::iterator> p = s.equal_range((Book)"石橋");
    for( ; p.first != p.second ; p.first++ )
        cout << setw(20) << (p.first)->Author << setw(20) << (p.first)->Title << endl;
}
つんく              モーニング娘。のすべて
石橋                C言語入門
石橋                アセンブラ入門
石橋                C++入門
中島                夜会

石橋                C言語入門
石橋                アセンブラ入門
石橋                C++入門


  次は、multisetを使った、アンケート結果表示プログラムの例を示します。
// STLを使うとwarningが出る可能性があるので、それを出さないようにする
#pragma warning (disable:4786)

#include<set>
#include<iostream>
#include <iomanip>
using namespace std;

// アンケートの選択肢
enum response{
    no_answer,
    very_good,
    good,
    bad,
    very_bad
};

void main(){
    // multisetを宣言
    multiset<response>  s;

    // アンケート結果入力
    s.insert(no_answer);
    s.insert(very_good);
    s.insert(bad);
    s.insert(no_answer);
    s.insert(good);
    s.insert(bad);
    s.insert(very_good);
    s.insert(no_answer);
    s.insert(very_good);
    s.insert(very_bad);
    s.insert(good);


    // アンケート結果
    int result_no_answer = s.count(no_answer);
    int result_very_good = s.count(very_good);
    int result_good      = s.count(good);
    int result_bad       = s.count(bad);
    int result_very_bad  = s.count(very_bad);

    // 有効解答数
    int valid = s.size() - result_no_answer;

    // 結果表示
    cout << setiosflags( ios::left ) << flush;
    cout << "very_good : " << result_very_good << "  (" << 100 * result_very_good / valid << "%)" << endl;
    cout << "     good : " << result_good      << "  (" << 100 * result_good      / valid << "%)" << endl;
    cout << "      bad : " << result_bad       << "  (" << 100 * result_bad       / valid << "%)" << endl;
    cout << " very_bad : " << result_very_bad  << "  (" << 100 * result_very_bad  / valid << "%)" << endl;
    cout << endl;
    cout << "valid result : " << valid << endl;
}
very_good : 3  (37%)
     good : 2  (25%)
      bad : 2  (25%)
 very_bad : 1  (12%)

valid result : 8


←前ページへ :  トップへ :  次ページへ→