私はintordive unordered_mapを使用したいと思っています。なんらかの理由で、ライブラリにはunordered_setしかありません。侵入型のハッシュテーブルもありますが、同じ機能を持っているかどうかは分かりませんし、同じインターフェースも持っていません。
私は間違っていますが、私はunordered_mapリンクを見逃しましたか?
私はそれを実装するのに役立つチュートリアルはありませんか?Boost.Intrusive and unordered_map
答えて
これは興味深い質問です。 Boost.Intrusiveは、順序付けされた、または順序付けされていないマップインターフェイスを提供しているようではありません。これは、順序付けされた(赤黒の木、AVLツリー、スプレイツリー)と順序付けられていない(ハッシュテーブル)の両方のマップとしてうまく動作する多くの実装タイプを持っています。しかし地図はありません。理由を教えられませんでした。
私はそれを見るようにあなたは2つの選択肢があります。順不同コンテナはハッシュテーブルとして実装されている(と彼らはhash_map
呼ばはない唯一の理由は、事前に名前の衝突を避けるためです:
- ちょうど
hashtable
を使用すでにその名前を使用している既存のライブラリ)。それはあなたの仕事を終わらせたい場合にはうまくいくでしょう。 - 実際に独自のものを実装したい場合は、Boost.Intrusiveのunordered_setのインターフェースの説明を見てください。私は実装を見ていないが、ほぼ確実に1つ以上のツリー型のラッパーである。
std::set
とstd::map
はともに、(GCC、MSVC、Apacheのstdcxxで見たすべての標準ライブラリの実装で)赤黒のツリーを囲むラッパーとして実装されています。また、libstdC++がツリーの実装を<map>
と<set>
にラップする方法も見てください。それは多くの定型文であり、その多くは面倒ですが、どちらのタイプもほとんどすべての作業をツリーに委ねます。 Boost.Intrusiveのunordered_set
とほぼ同じことがほぼ確実に起きています。マップとインターフェイスの違いを見て、それをunordered_set
をunordered_map
に変更するための基礎として使用する必要があります。
私は後者を行いました。面倒なところですが、単体テストを書くことを強くお勧めします(またはlibstdC++やBoost.Intrusiveに付属のものを盗むこと)。しかし、それは実行可能です。私は、彼らがマップをしていない理由を実現::私はまた、非常にどちらかのSGI(set、map)で、またはlibstdc++
更新のために、セットとマップのための要件文書を読んでお勧め侵入コンテナはあなたが埋め込むことを要求しますそこに格納している値タイプのデータ構造のノード情報。マップの場合は、値とキーの両方でこれを行う必要があります。これは不可能ではありませんが、map
の標準実装ではset
のようにと同じ内部型が使用されます。しかし、これらの内部型はの1つしかありません。value_type
変数:キーと値を格納するために、キーと値をその変数にコピーしてノードに格納します。これを行うには、その実装タイプをセットと互換性がないように変更する必要があります。つまり、キーへの参照と値を個別に格納する必要があります。。そのためには、使用する実装(おそらくhashtable
)を変更する必要があります。やはり不可能ではないが、図書館の設計者は重大なコードの重複を避けようとしているので、これを実装する簡単な方法がないと、地図を残してしまう可能性が最も高い。
それは意味がありますか?
この質問は尋ねられて以来、長いことがありましたが、ここに来る人々はunordered_set
を地図として使用する方法に関心があると思います。解決策はadvanced insertions methodsを使用することです:キーとその値を同じvalue_type
に保存し、insert_check
とinsert_commit
を使用して挿入するだけです。
あなたは技術的に高度な挿入を必要としない場合でも、高度な検索が必要です(find(key)を行うには)。 –
- 1. :: unordered_map
- 2. C++ unordered_mapここでkeyもunordered_map
- 3. CMake target_compile_features unordered_map
- 4. unordered_mapセグメントエラー
- 5. unordered_mapは4.2
- 6. unordered_mapのEXC_BAD_ACCESS
- 7. unordered_map挿入()エラー
- 8. unordered_mapのC#構文
- 9. ブーストスピリットX3とstd :: unordered_map
- 10. boost :: serialization of boost :: unordered_map
- 11. boost :: unordered_map boost :: interprocess :: cached_node_allocatorコンパイルエラー
- 12. C++でunordered_mapを同期
- 13. hash_mapとunordered_mapの違いは?
- 14. google :: dense_hash_mapとstd :: tr1 :: unordered_map?
- 15. データ構造を持つUnordered_map
- 16. "const unordered_map"の使い方は?
- 17. プロセス間マップとmap/unordered_map
- 18. unordered_mapでの検索のパフォーマンス
- 19. C++ unordered_map単一オブジェクトのイテレータ
- 20. C++ STL unordered_mapイテレータ問題
- 21. std :: unordered_mapの初期化
- 22. C++ unordered_mapをbuffer(char *)にシリアライズ
- 23. rcppでのunordered_mapの使用
- 24. unordered_mapとunordered_setの比較
- 25. hash_map/unordered_mapの分離バージョン
- 26. std :: unordered_mapヒント付き挿入
- 27. C++ unordered_mapユーザ定義型
- 28. Androidでunordered_mapを使用するには?
- 29. Where And And after $
- 30. SubSonic "Or" AND "AND"
だから問題はありませんか?私はここで時間と品質を考えているからです。 –
これは相当量の作業です。標準コンテナのインタフェースには多くの微妙な違いがあります。私は侵入型の容器をそれと同じように仮定します。時間が本質である場合はオプション1に行く。時間があり、たくさんのことを本当に学びたければ、オプション2で行く。 – quark
あなたはあなた自身でそれを言った。 共有してもよろしいですか? –