2010-11-26 11 views
1

私はlist of itemsItemListと呼ばれるクラスのインスタンス)を持つクラスを持っています。boost_unorderedのハッシュ関数ですが、デフォルトはありませんか?

ItemIndexType AddItem(...); 
void DoSomething(ItemIndexType index, ...); 

ItemIndexType "スマート反復子" のいくつかの種類として機能し、メンバ変数
myIter (iterator to a multimap in the ItemList)があり、
myList (pointer to the ItemList): このItemListクラスは、次のような機能を持っています。
さらにハウスキーピングに使用されています。
ItemListからアイテムを削除すると、そのアイテムを指すすべてのインデックスがクリアされるので、賢明です。 (地図の最後を指す)。

これは今のところ意図どおりに動作しており、私はもはやあまりそれをあまり変更しません。しかし、アプリケーションのために、私は余分な何かをする必要があります。

void ResetItem(ItemIndexType ind); 

この関数その後、元の値にまでアイテムindポイントを「リセット」になります。私は、関数が「リセット」を構築しています。私はitemクラス内にorignal値を格納したくないので、itemindexをキーとし、アイテムが構築された元の引数をvalueとするコンテナを作成することにしました。

注文は必要ないだけでなく、不可能です。私はboost :: unorderedが行く方法だと考えています。私はハッシュテーブルにインデックスを追跡するために使用デックを変更
は、しかし奇妙なエラーをもたらした:

機能\ハッシュの\ extensions.hpp(176)\

Xの\ブースト:エラーC2665:「ブースト: :HASH_VALUE」:カスタムデータ型のハッシュ関数を作成する方法

typedef boost::unordered_map<ItemIndexType, ListDataType> ListContType; 

:16のオーバーロードのどれもリストがで作成されたすべての引数の型

を変換することができませんでしたか?

+0

"Boost.Unorderedはboost :: hashを使用しているため、標準コンテナを含むいくつかの他の型もサポートしています。 Boost.Hashを拡張して型をサポートするか、独自のカスタム同値述語とハッシュ関数を使用する必要があります。 - > http://www.boost.org/doc/libs/1_45_0/doc/html/hash/custom.html – icecrime

+0

おかげで、特定のキー(myIterに格納されているイテレータ)を特定するのに役立ちます。 std :: * iteratorから型の中の1つへの変換を与えないでください! – paul23

答えて

2

鍵データ型には等価述語とハッシュ関数が必要です。Equality Predicates and Hash Functionsを参照してください。単純型のハッシュ関数を組み合せることで、ハッシュ関数を構築することができます。boost::hash_combine

+0

boost :: hash_combine()。キーの各部分に対して "hash_value"を呼び出すだけです。ユニークな) "part"は抽象型です。私は力を持っていません(std :: bidirectional_iterator)。イテレータに 'boost :: hash_value'のオーバーロードされた関数はありません! – paul23

関連する問題