Java には、予測可能な反復順序を持つセットであるLinkedHashSetがあります。C++ で利用可能な最も近いデータ構造は何ですか?
現在、セットとベクターの両方を使用してデータを複製しています。データをセットに挿入します。データが正常に挿入された場合 (つまり、データがまだセットに存在していなかった場合)、ベクターに push_back します。データを反復処理するときは、ベクトルを使用します。
Java には、予測可能な反復順序を持つセットであるLinkedHashSetがあります。C++ で利用可能な最も近いデータ構造は何ですか?
現在、セットとベクターの両方を使用してデータを複製しています。データをセットに挿入します。データが正常に挿入された場合 (つまり、データがまだセットに存在していなかった場合)、ベクターに push_back します。データを反復処理するときは、ベクトルを使用します。
使用できる場合、とインデックスを持つBoost.MultiIndexは と同じデータ構造です。sequenced
hashed_unique
LinkedHashSet
それに失敗した場合は、リストノードを含む何らかのタイプの an unordered_set
(またはhash_set
、それが実装で提供されている場合は ) を保持し、そのリストノードを使用して自分で順番を処理します。
現在行っていること (set
およびvector
) の問題は次のとおりです。
mutable
順序比較によって無視されるデータ メンバーがオブジェクトにあり、誰かがルックアップを介して変化し、変更を確認することを期待するコードを記述した場合順番に繰り返す)。LinkedHashSet
、シーケンスの途中で要素をすばやく削除する方法はありません。また、位置ではなく値で削除する場合は、削除する値のベクトルを検索する必要があります。set
ハッシュ セットとは異なるパフォーマンス特性を持っています。あなたがそれらのことを気にしないなら、あなたが持っているものはおそらく大丈夫です. 重複が唯一の問題である場合は、重複のベクトルではなく、セット内の要素へのポインターのベクトルを保持することを検討できます。
C++ で Java から複製するLinkedHashSet
には、これが機能するために 2 つのバニラが必要になると思います(挿入と削除のために O(log n) を取得する代わりに本物ではなくstd::map
取得することに注意してください)。LinkedTreeSet
LinkedHashSet
挿入するときはstd::map::find
、最初std::map
に in を使用して、同じオブジェクトが存在しないことを確認します。
std::map
前述の両方に増分挿入順序でこのオブジェクトをマップします。これを挿入順に反復する場合は、挿入順に並べ替えられるため、2 番目を反復します( orstd::map
に該当するものはすべて自動的に並べ替えられます)。std::map
std::set
要素を削除する場合は、 を使用std::map::find
して挿入の順序を取得します。この挿入順序を使用して、2 番目のものから要素を削除std::map
し、最初のものからオブジェクトを削除します。
このソリューションは完璧ではないことに注意してください。これを長期的に使用する予定がある場合は、最終的に広告掲載オーダー (2 unsigned int の場合は ^32 インデックス、unsigned long long int の場合は 2^64 インデックス)。これを行うには、すべての「値」オブジェクトをベクトルに配置し、両方のマップからすべての値をクリアしてから、ベクトルから両方のマップに値を再挿入する必要があります。この手順には O(nlogn) 時間がかかります。
C++11 を使用している場合、効率を向上させるために最初のものstd::map
をstd::unordered_map
に置き換えることができますが、2 番目のものを置き換えることはできません。その理由はstd::unordered map
、この状況ではインデックスを確実にソートできないように、インデックス作成にハッシュ コードを使用するためです。
「null」ルックアップ時間のように、std::map が (log n) のようなものを与えないことを知りたいかもしれません。また、 std::tr1::unordered を使用すると、一定のルックアップ時間を得るために順序付けが破棄されるため、危険なビジネスになります。
ブースト マルチ インデックス コンテナーをバッシュして、より自由に操作できるようにしてください。
と の組み合わせを説明した方法は、(Java の HashSet と同等) と(二重にリンクされたリスト)を使用することを除いて、やるべきことのようstd::set
に聞こえます。また、(キーがオブジェクト (またはオブジェクトの一部のみ) と異なる場合) を格納する実際のオブジェクトを見つけるリストにイテレータと共にキー (検索用) を格納するために使用することもできます。std::vector
std::unordered_set
std::list
std::unordered_map
ブースト ライブラリは、コンテナーとルックアップ インデックスのこれらの種類の組み合わせを多数提供します。たとえば、この高速ルックアップの双方向リストの例をご覧ください。