multisetの問題について別の質問をしましたが、私はまともな理解が必要であり、インターネットでこれ以上複雑な例が見つからないことがわかりました。マルチセットをC++
multiset<A,B>
がどのように機能し、どの機能がAとBのどちらにあるのか、それらのいずれかを省略できる場合は、私に説明してもらえますか? AまたはBを変数に代入することはできますか?
multisetの問題について別の質問をしましたが、私はまともな理解が必要であり、インターネットでこれ以上複雑な例が見つからないことがわかりました。マルチセットをC++
multiset<A,B>
がどのように機能し、どの機能がAとBのどちらにあるのか、それらのいずれかを省略できる場合は、私に説明してもらえますか? AまたはBを変数に代入することはできますか?
std::multiset
std::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);
}
@juanchopanza [ありがとう、あなたと一緒に大きな助け(http://en.cppreference.com/ cpp/container/multisetを使用しています)。私がまだ分かっていないのは、 'multiset 'を置くと、 'B'のない機能の違いは何ですか?マルチマップの内容をソートするためにブール値を使って 'less <>'がどのように働いているのか分かりませんか?私はこの知識が後でいくつかのアプリケーションのために必要になるかもしれないことを意味します。 – berndh
@eco_student 'B'は、順序付けに使用するロジックを指定する方法、または有効な' operator <'がない場合にロジックを指定する方法です。特定のタイプの要素を順序付けるための基準が異なる場合があります。そのため、セット/マルチセットごとにどの基準を使用するかを自由に決定できます。 – juanchopanza
'のstd :: multiset'は、最近のC++(特に2011標準)ライブラリからの標準テンプレートです。一般的なC++テンプレートに精通していますか?あなたは 'std :: vector'と' std :: map'をすでに理解していますか? –
http://www.sgi.com/tech/stl/multiset.html – DumbCoder
@BasileStarynkevitch実際には 'std :: multiset'はC++ 98に既に存在していますが、コメントはC++ 11のように聞こえますまたはあなたのコメントを誤解しただけです)。 –