2009-07-31 4 views
11

私はintordive unordered_mapを使用したいと思っています。なんらかの理由で、ライブラリにはunordered_setしかありません。侵入型のハッシュテーブルもありますが、同じ機能を持っているかどうかは分かりませんし、同じインターフェースも持っていません。
私は間違っていますが、私はunordered_mapリンクを見逃しましたか?
私はそれを実装するのに役立つチュートリアルはありませんか?Boost.Intrusive and unordered_map

答えて

7

これは興味深い質問です。 Boost.Intrusiveは、順序付けされた、または順序付けされていないマップインターフェイスを提供しているようではありません。これは、順序付けされた(赤黒の木、AVLツリー、スプレイツリー)と順序付けられていない(ハッシュテーブル)の両方のマップとしてうまく動作する多くの実装タイプを持っています。しかし地図はありません。理由を教えられませんでした。

私はそれを見るようにあなたは2つの選択肢があります。順不同コンテナはハッシュテーブルとして実装されている(と彼らはhash_map呼ばはない唯一の理由は、事前に名前の衝突を避けるためです:

  1. ちょうどhashtableを使用すでにその名前を使用している既存のライブラリ)。それはあなたの仕事を終わらせたい場合にはうまくいくでしょう。
  2. 実際に独自のものを実装したい場合は、Boost.Intrusiveのunordered_setのインターフェースの説明を見てください。私は実装を見ていないが、ほぼ確実に1つ以上のツリー型のラッパーである。 std::setstd::mapはともに、(GCC、MSVC、Apacheのstdcxxで見たすべての標準ライブラリの実装で)赤黒のツリーを囲むラッパーとして実装されています。また、libstdC++がツリーの実装を<map><set>にラップする方法も見てください。それは多くの定型文であり、その多くは面倒ですが、どちらのタイプもほとんどすべての作業をツリーに委ねます。 Boost.Intrusiveのunordered_setとほぼ同じことがほぼ確実に起きています。マップとインターフェイスの違いを見て、それをunordered_setunordered_mapに変更するための基礎として使用する必要があります。

私は後者を行いました。面倒なところですが、単体テストを書くことを強くお勧めします(またはlibstdC++やBoost.Intrusiveに付属のものを盗むこと)。しかし、それは実行可能です。私は、彼らがマップをしていない理由を実現::私はまた、非常にどちらかのSGI(setmap)で、またはlibstdc++

更新のために、セットとマップのための要件文書を読んでお勧め侵入コンテナはあなたが埋め込むことを要求しますそこに格納している値タイプのデータ構造のノード情報。マップの場合は、値とキーの両方でこれを行う必要があります。これは不可能ではありませんが、mapの標準実装ではsetのようにと同じ内部型が使用されます。しかし、これらの内部型はの1つしかありません。value_type変数:キーと値を格納するために、キーと値をその変数にコピーしてノードに格納します。これを行うには、その実装タイプをセットと互換性がないように変更する必要があります。つまり、キーへの参照と値を個別に格納する必要があります。。そのためには、使用する実装(おそらくhashtable)を変更する必要があります。やはり不可能ではないが、図書館の設計者は重大なコードの重複を避けようとしているので、これを実装する簡単な方法がないと、地図を残してしまう可能性が最も高い。

それは意味がありますか?

+0

だから問題はありませんか?私はここで時間と品質を考えているからです。 –

+1

これは相当量の作業です。標準コンテナのインタフェースには多くの微妙な違いがあります。私は侵入型の容器をそれと同じように仮定します。時間が本質である場合はオプション1に行く。時間があり、たくさんのことを本当に学びたければ、オプション2で行く。 – quark

+0

あなたはあなた自身でそれを言った。 共有してもよろしいですか? –

6

この質問は尋ねられて以来、長いことがありましたが、ここに来る人々はunordered_setを地図として使用する方法に関心があると思います。解決策はadvanced insertions methodsを使用することです:キーとその値を同じvalue_typeに保存し、insert_checkinsert_commitを使用して挿入するだけです。

+1

あなたは技術的に高度な挿入を必要としない場合でも、高度な検索が必要です(find(key)を行うには)。 –