2012-01-12 9 views
20

ここでhttp://www.cplusplus.com/reference/stl/set/私はstd :: setはC++で "典型的には"ツリー(赤黒の?)として実装されていて、ソートされていると読んでいます。C++仕様によれば、std :: setの反復順序は常に昇順ですか?

私が理解できなかったのは、仕様での反復順序は常に昇順ですか?あるいは、「通常の実装の詳細」だけですか、時にはライブラリ/コンパイラによってはこの規約に違反することがありますか?

答えて

33

C++標準では、std::setの要素に対する反復は、std::lessで指定されたソート順、またはオプションの比較述部テンプレートの引数によって行われます。

(また、C++標準、挿入、検索と削除ごとに最もO(LG Nで取る)時間なので、バランスの取れた探索木は、現在std::setのための唯一の現実的な実装の選択であっても赤黒の使用にもかかわらず標準では木は義務付けられていません)。

1

仕様でセットの繰り返し順序は、常にあなたが順序でそれらをプリントアウトした場合はい、セットの値は常に昇順いる

を昇順です。記述によれば、Red-Black Tree(RBT)を使用して実装されているのが一般的ですが、コンパイラライターには違反するオプションがありますが、RBTのテーマに固執します。 setのタスク。

3

デフォルトのコンパレータはより少ないので、セットは昇順に並べられます。これを変更するには、別の既存またはカスタムのコンパレータをテンプレート引数として指定できます。

13

これは、内部でstd::setがソートされたツリーとしてその要素を格納することを意味します。ただし、この仕様ではソート順については何も言及していません。既定では、std::setstd::lessを使用しているため、低から高になります。しかし、あなたはこのコンストラクタを使用して、ソート機能は、あなたが好きなこと行うことができます。

std::set<valueType, comparissonStruct> myCustomOrderedSet; 

したがって、たとえば:実際には

std::set<int, std::greater<int> > myInverseSortedSet; 

または

struct cmpStruct { 
    bool operator() (int const & lhs, int const & rhs) const 
    { 
    return lhs > rhs; 
    } 
}; 

std::set<int, cmpStruct > myInverseSortedSet; 

を、これらの例もありますあなたがリンクしたウェブサイトで提供されます。より具体的には、set constructorです。

1

C++ 11 N3337標準案http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

23.2.4 "連想コンテナは" 言う:

1連想コンテナがキーに基づいてデータの高速検索を提供しています。ライブラリには、集合、マルチセット、マップ、マルチマップの4つの基本的な種類の連想型コンテナが用意されています。

と:

10連想コンテナのイテレータの基本的な特性は、それらが非下降があった比較によって定義されたキーの非降順にコンテナ を反復することですそれらを構築するために使用されている。 。

のではい、注文はhttps://stackoverflow.com/a/11812871/895245として基本的に言及したC++標準で保証されているバランスの取れた探索木の​​実装が必要です。

また、C++ 11 unordered_setと対照的に、より制限の少ないより優れたパフォーマンスを提供する可能性があります。Why on earth would anyone use set instead of unordered_set?ハッシュセットを使用します。

関連する問題