4

文字列を介して特定のオブジェクトにインデックスを付ける連想コンテナが必要ですが、挿入の順序も保持されるため、名前で特定のオブジェクトを検索するか、オブジェクトを繰り返し処理して、挿入したのと同じ順序でオブジェクトを取得できます彼ら。

リンクリストとハッシュマップのこのハイブリッドはうまくいくはずだと思いますstd::tr1::unordered_mapが、それがそのように機能していると思って使用しようとする前に、私は説明しましたが、そうではありませんでした。それで、誰かが私にその意味と振る舞いを説明できunordered_mapますか?


@wesc:std :: mapはSTLによって実装されていると確信していますが、std :: hash_mapはSTLに含まれていないと確信しています(古いバージョンのVisual Studioではstdextという名前空間に配置されていると思います)。

@cristopher:ですから、私が正しく理解すれば、違いは実装(したがってパフォーマンス)にあり、外部での動作にはありません。

4

7 に答える 7

17

Boost :: MultiIndexが作成された標準的な理由を尋ねました:キーによる高速ルックアップを使用したリストの挿入順序。 ブーストマルチインデックスチュートリアル:リストの高速ルックアップ

于 2008-08-30T15:04:13.377 に答える
7

連想コンテナに2つの方法でインデックスを付ける必要があります。

  • 挿入順序
  • 文字列の比較

Boost.MultiIndexまたはBoost.Intrusiveを試してください。私はこのように使用していませんが、可能だと思います。

于 2008-08-30T14:47:15.383 に答える
4

注文されていないコンテナのドキュメントを後押し

違いは、ルックアップを生成する方法にあります。

マップ/セットコンテナでoperator<は、は順序付けられたツリーを生成するために使用されます。

順序付けされていないコンテナでは、operator( key ) => indexが使用されます。

それがどのように機能するかの説明については、ハッシュを参照してください。

于 2008-08-30T13:53:56.120 に答える
2

申し訳ありませんが、最後のコメントを間違って読んでください。はい、hash_mapはSTLにありません、mapはあります。しかし、unordered_mapとhash_mapは、私が読んでいるものと同じです。

マップ->ログ(n)挿入、取得、反復は効率的です(そしてキー比較によって順序付けられます)

hash_map / unordered_map->定数時間の挿入と取得、反復時間は効率的であることが保証されていません

マップは挿入シーケンスではなくキーの内容に基づいて物事を並べ替えるため、これらのどちらも単独では機能しません(キーに挿入シーケンスに関する情報が含まれている場合を除く)。

説明したこと(list + hash_map)を実行するか、挿入配列番号と適切な比較関数を持つキータイプを作成する必要があります。

于 2008-08-30T14:21:51.483 に答える
0

unordered_mapとhash_mapは多かれ少なかれ同じものだと思います違いは、STLには公式にはhash_mapがないため(使用しているのはおそらくコンパイラ固有のものです)、unordered_mapがその省略の修正です。

unordered_mapはまさにそれです...unordered。反復の順序を維持することに依存することはできません。

于 2008-08-30T13:31:42.163 に答える
0

std :: hash_mapがすべてのSTL実装に存在することを確認しますか?SGI STLはそれを実装していますが、4.3.1の時点では、GNU g ++にはありません(__gnu_cxx名前空間にあります)。私の知る限り、hash_mapは常に非標準であり、tr1がそれを修正しています。

于 2008-08-30T13:57:23.943 に答える
-3

@wesc:STLにはstd :: map ...がありますが、unordered_mapとの違いは何ですか?STLが同じことを2回実装し、それを別の方法で呼び出すことはないと思います。

于 2008-08-30T13:41:01.470 に答える