web-dev-qa-db-ja.com

C ++の同等のLinkedHashmap?

私はそれをC++に変換したいJavaプログラムを持っています。したがって、Javaコードで使用されるLinkedhashmapデータ構造がありますそれをC++に変換したいのですが、C++のLinkedHashmapに相当するデータ型はありますか?

std::unordered_mapを使用しようとしましたが、挿入の順序が維持されません。

11
emadalamoudi

C++は、Javaの_LinkedHashMap<K,V>_を模倣する動作を備えたコレクションテンプレートを提供しないため、マッピングとは別に順序を維持する必要があります。

これは、データを_std::list<std::pair<K,V>>_に保持し、キーでアイテムをすばやく検索できるように別の_std::unordered_map<k,std::list::iterator<std::pair<K,V>>>_マップを保持することで実現できます。

  • アイテムを追加するときに、対応するキーと値のペアをリストの最後に追加し、キーをイテレーターstd::prev(list.end())にマップします。
  • キーでアイテムを削除するときは、そのイテレータを検索し、リストから削除してから、マッピングを削除します。
  • アイテムを置き換えるときは、最初に順序付けされていないマップからリストイテレータを検索してから、そのコンテンツを新しいキーと値のペアに置き換えます。
  • 値を繰り返す場合は、単に_std::list<std::pair<K,V>>_を繰り返します。
17
dasblinkenlight

キー反復の挿入順序コントラクトは、log(n)パフォーマンスのバランスの取れたツリーで実現できます。アイテムの削除にはn回のルックアップ時間が必要なため、これはリスト内のキーを維持するよりも優れています。私のマントラは、あなたが調べたものをリストに載せることは決してありません。並べ替える必要がない場合は、ハッシュを使用してください。ソートする必要がある場合は、バランスの取れたツリーを使用してください。繰り返すだけの場合は、リストで問題ありません。 C++では、これはstd::mapここで、キーはアイテム参照であり、値は挿入順序です。キーは赤黒木を使用してソートされます。参照: STLにソートされたコンテナはありますか

2
zettix

UnorderedMapまたはC++に組み込まれている他のSTLメソッドは、LinkedHashMapと同じ順序を指定できませんが、挿入の順序を維持し、維持された順序を使用してunordered_mapにアクセスできます。

以下は、unordered_mapがどのように動作するかを示すための画像です。注文はありません。

マップはRBツリーであり、イテレータが使用されている場合はソートされた順序になります。

したがって、この質問に対する具体的な解決策はありません。

Unordered HashMap

0
shaurya uppal