2012-11-22 18 views
6

multisetの問題について別の質問をしましたが、私はまともな理解が必要であり、インターネットでこれ以上複雑な例が見つからないことがわかりました。マルチセットをC++

multiset<A,B>がどのように機能し、どの機能がAとBのどちらにあるのか、それらのいずれかを省略できる場合は、私に説明してもらえますか? AまたはBを変数に代入することはできますか?

+1

'のstd :: multiset'は、最近のC++(特に2011標準)ライブラリからの標準テンプレートです。一般的なC++テンプレートに精通していますか?あなたは 'std :: vector'と' std :: map'をすでに理解していますか? –

+0

http://www.sgi.com/tech/stl/multiset.html – DumbCoder

+0

@BasileStarynkevitch実際には 'std :: multiset'はC++ 98に既に存在していますが、コメントはC++ 11のように聞こえますまたはあなたのコメントを誤解しただけです)。 –

答えて

17

std::multisetstd::multisetクラステンプレートには、セットに格納されるオブジェクトのタイプを指定する最初のテンプレートパラメータと、比較ファンクタのタイプを指定する2番目のテンプレートパラメータがあります。ここでは3番目のテンプレートパラメータは無視できます。

第2のオプションのパラメータBは、strict weak orderingを実装する必要があり、セット/マルチセットの注文に使用されます。この順序付けは、要素ルックアップ操作の対数的複雑さを保証するために必要です。次に例を示します。

struct A 
{ 
    int x; 
}; 

struct B 
{ 
    bool operator()(const A& lhs, const A& rhs) const { 
    return lhs.x < rhs.x; 
    } 
}; 

このクラスBは、それが呼び出すことができることを意味し、operator()があり、例えば

B comp; 
A a1, a2; 
bool a1lessThana2 = comp(a1, a2); 

これは正しいの要素を配置するセット/マルチセットのために必要とされます2つの要素が同じであるかどうかを判断します。あなたのタイプにoperator<がある場合、2番目のテンプレートパラメータは省略できます。

bool operator<(constA& lhs, const A& rhs) { return lhs.x < rhs.x; } 

これは使い方の例です:

int main() 
{ 
    std::multiset<A, B> m; 
    A a1, a2; 
    a1.x = 23; 
    a2.x = 100; 
    m.insert(a1); 
    m.insert(a2); 
} 
+1

@eco_student 'B'は、順序付けに使用するロジックを指定する方法、または有効な' operator <'がない場合にロジックを指定する方法です。特定のタイプの要素を順序付けるための基準が異なる場合があります。そのため、セット/マルチセットごとにどの基準を使用するかを自由に決定できます。 – juanchopanza

関連する問題