2011-01-14 29 views

答えて

3

順序付けられた順序付けられていない順序は、コンテナに対して推移的に適用されます。

あなたが興味を持っているのは、シーケンスです。これは、コンテナを繰り返し(おそらくスライス)繰り返したときに要素が表示される順序です。

シーケンスはより一般的ですが、この種の概念では、STLの背後に潜んでいるさまざまな概念のタクソノミを見つけることができるときにSGI STL website(現在のSTLの母親)を参照します。

まず、Sequence。このシーケンスで興味深いのは、それを変更せずに2回横断すると、同じ順序で要素が生成されるという保証はないということです。これは、たとえば、最後の要素を最初に移動して、何らかの形のキャッシングを実装するコンテナの場合です。この場合、繰り返しはコンテナを効果的に逆転させます。

Ordered Associative Container

は、基準の順序が固定されたコンテナであり、そしてそれは、その要素のスライスを反復するたびに、常に彼らがこの基準に従って順序付け遭遇するだろうことを保証します。これに対して、

Hashed Associative Containerは異なります。順序付け基準の代わりに、それはハッシングを使用する。 SGI STLはバケツを使用しなければならないということも厳密には厳しく制限されています。ここでは、反復は基本的に順序付けられていません。要素がどのように出るかは全く制御できません。また、再ハッシングに何らかのランダム性が適用されている場合、プログラムの実行ごとに同一ではないかもしれません。

順不同コンテナ、彼らは名前がhash_sethash_mapの既存の実装と衝突したくなかったので、彼らは、ブーストおよびC++ 0xのために思い付いた用語です。したがって、SGI STLに記載されていないものの、順序付けされていない種類は、以前のハッシュされた種類に近似します。あなたが本当に知っている必要があり何

を順序は、要素が順不同が(全く)オーダーの何種類が施行されていないことを意味しているソート出てくることを意味します。注文は費用がかかりますので、必要なときにのみお支払いください。たとえば、Python dictは実際には順序付けられていません。


私は本当にここ用語連想好きではありません。 1はset要素が一度にキーと値の両方でこの要件のモデルであることを考えるとき、それは、他の回答に加えて... 2個の順不同コンテナ(いない要素の 平等テスト

6

主な違いは、イテレータをインクリメントして順序付きコンテナを反復処理すると、キーの順にコンテナの要素にアクセスすることです。

これは、順序付けられていないコンテナでは必ずしも成立しません。

+0

コンテナにキーがない場合、イテレータは照合シーケンスによって要素を訪問します。 –

1

順序付けられていないコレクション(tr1::unordered_mapおよびtr1::unordered_set)は、一般にハッシュテーブルの実装を通じて値を取得します。これは、O(1)の償却平均ルックアップを与える。

注文コレクション(std::mapおよびstd::set)はノードベースです。これらのコレクションは、O(ログ)時間内に値を取得します。

+0

検索だけでなく挿入も同様です。 –

4

比較されたSTLコンテナは比較に基づいています。たとえば、std :: setは通常、赤黒のツリーとして実装されます。順序付けられていないSTLコンテナはハッシュアルゴリズムに基づいており、unordered_setはハッシュテーブルです。

通常、順序付けられていないコンテナは、挿入、参照、削除などの操作に必要なアルゴリズムコストが高くなります。しかし、その一定のコストはかなり高く、カスタムタイプのハッシュは場合によっては軽微である場合があります。順序付けられていないコンテナを特定の順序で反復することも不可能です。

通常、カスタムタイプの拡張は一般的に簡単であるため、コンテナのパフォーマンスが問題であると特定されない限り、ほとんどの用途でオーダーされたコンテナを使用します。

1

最初に:std::(map|set)と0xstd::unordered_(map|set)を話していると思います。まず、明白なことは、注文された容器が内容を保持していることです。これは、何かを挿入するときに余分な作業が必要であることを意味します(最初に挿入する場所を見つける必要があるため)。しかし、2つの要素を比較する方法(つまり、1つが他の要素より少ない場合)を指定する必要があります(組み込み型でない場合は、組み込み型のように)。順序付けられていないコンテナは内容を順序付ける必要はありませんが、挿入と要素のアクセスは高速ですが、(カスタムタイプの場合は)良いハッシュ関数と同等性のテストが必要です。

0

他の返信でもう一度見落とされることがもう1つあります。順序付きコンテナは、operator<を使用するか、Traitsクラスoperator()を使用して厳密な弱い順序が必要です。その結果、それらのコンテナを反復することは、それらの関数に従って順序付けられます。順序付けられていないコンテナは、同じことを行う述語関数の等価比較演算子のみを必要とします。したがって、コンテナ内の要素の順序付けはありません(バケットの内部順序付けを除く)。

0

少し誤解を招くようです)は、 の順序付けられていない性質のために難しい。 可能ですが、高価な場合があります。

関連する問題