2010-11-26 5 views
1

Ich habe eine Klasse, die list of items (eine Instanz einer Klasse namens ItemList) hat. Diese ItemList Klasse hat Funktionen wie:Hash-Funktion für boost_unordered, keine Voreinstellung möglich?

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

ItemIndexType wirkt als eine Art von "smart Iterator" und hat die Elementvariablen
myIter (iterator to a multimap in the ItemList),
myList (pointer to the ItemList).
Und ein paar mehr für die Hausverwaltung verwendet.
Es ist schlau, da, wenn ich einen Artikel aus der Artikelliste löschen würde, alle Indizes, die auf den Artikel zeigen, gelöscht werden. (zeigt auf das Ende der Karte).

Es funktioniert jetzt wie beabsichtigt, und ich ändere es lieber nicht mehr zu sehr. Doch für die Anwendung muss ich etwas extra tun: Ich baue ein „Reset“ -Funktion:

void ResetItem(ItemIndexType ind); 

Diese Funktion würde „Reset“ das Element ind Punkte auf den ursprünglichen Wert dann. Ich möchte den ursprünglichen Wert nicht in der Elementklasse speichern. Daher habe ich beschlossen, einen Container zu erstellen, der als Schlüssel den Elementindex und als Wert die ursprünglichen Argumente enthält, mit denen der Artikel strukturiert wurde.

Da Bestellung nicht nur nicht benötigt wird, ist es auch unmöglich, ich denke Boost :: ungeordnet ist der Weg zu gehen.
das Deque Ändern I verwendet Spur des Indizes auf die Hash-Tabelle zu halten, ergab allerdings einen seltsamen Fehler:

X \ boost \ funktionellen \ hash \ extensions.hpp (176): Fehler C2665: ‚boost: : hash_value‘: keine der 16 Überlastungen kann alle Argumenttypen

konvertieren Wenn die Liste erstellt wird:

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

Wie eine Hash-Funktion für einen benutzerdefinierten Datentyp zu schaffen?

+0

erstellen. "Da Boost.Umordered boost :: hash verwendet, unterstützt es auch einige andere Typen, einschließlich Standardcontainern. Um alle Typen zu verwenden, die von diesen Methoden nicht unterstützt werden Boost.Hash muss erweitert werden, um den Typ zu unterstützen oder eigene benutzerdefinierte Gleichheitsprädikate und Hashfunktionen zu verwenden. " -> http://www.boost.org/doc/libs/1_45_0/doc/html/hash/custom.html – icecrime

+0

danke, das hilft mir, den spezifischen Schlüssel zu identifizieren (der Iterator in 'myIter' gespeichert. Aber es tut es immer noch nicht 't geben eine Umwandlung von std :: * :: iterator zu einem der eingebauten Typen! – paul23

Antwort

2

Sie benötigen ein Gleichheitsprädikat und eine Hash-Funktion für Ihren Schlüsseltyp, siehe Equality Predicates and Hash Functions. Sie können Ihre Hash-Funktion durch Kombinieren der Hash-Funktionen von einfachen Typen mit boost::hash_combine

+0

boost :: hash_combine()., ruft nur "hash_value" für jeden Teil des Schlüssels .. Problem ist, dass 1 (und der nur eindeutig) "part" ist ein abstrakter Typ Ich habe keine Macht über (std :: bidirektional_iterator). Es gibt keine überladene Funktion von 'boost :: hash_value' für Iteratoren! – paul23

Verwandte Themen