2016-08-08 72 views
1

Unfortunatly dies:unordered_map mit Iteratoren als Schlüssel, Iterator zu lange lang?

unordered_map<list<int>::iterator, int> foo; 

nicht funktioniert, der Compiler sagt: Fehler C2338: Der C++ Standard sieht keine einen Hash für diesen Typ.

Es scheint jedoch ein Hash für 64-Bit-Integer zu sein, ist es so

unordered_map<long long, int> foo; 

stattdessen verwenden speichern und einfach die Iteratoren long long werfen?

Antwort

1

Nein, das ist im Allgemeinen nicht möglich. Während Zeiger in und von Integer-Typen umgewandelt werden können (mehr dazu später), sind Iteratoren nicht unbedingt Zeiger und daher ist diese Umwandlung nicht unbedingt zulässig. Betrachten Sie zum Beispiel etwas wie eine istream_iterator, die ein Stream-Objekt umschließt. Es ist unklar, was es bedeuten würde, dies zu oder von einem long long zu werfen. Wenn Sie versuchen, das Problem auf diese Weise zu lösen, müssen Sie möglicherweise Ihren Ansatz ändern.

Als eine Anmerkung - der Typ long long ist nicht wirklich erforderlich, groß genug, um einen Zeiger, der in eine ganze Zahl umgewandelt wurde, zu halten. Die speziellen Typen intptr_t und uintptr_t sind garantiert groß genug, um einen Zeiger zu speichern. Daher sollten Sie diese Typen stattdessen verwenden. Sie können jedoch immer noch keine Listen-Iteratoren auf diese Typen anwenden.

+0

Wie wäre es mit der Adresse des Objekts, auf das der Iterator zeigt? Vielleicht könnte ich das als Schlüssel benutzen? – testman

+0

Das sollte funktionieren, sofern Sie den Zeiger nicht wie einen Iterator behandeln müssen. Aus Neugier, was versuchst du zu tun? Vielleicht möchten Sie eine separate Frage, in der Ihr Ziel beschrieben wird, veröffentlichen, da ich den Verdacht hege, dass Ihnen eine viel sauberere Möglichkeit zur Lösung dieses Problems fehlt. – templatetypedef

+0

Ich möchte ein Diagramm von schweren Objekten durchlaufen, so dass ich einen Vektor von Iteratoren zu diesen Objekten habe, aber ich brauche die inverse Zuordnung auch für Breite/Tiefe erste Suche. Es gibt wahrscheinlich effiziente Graph-Bibliotheken, aber ich brauche nicht viel mehr als diese Traversierungsfunktion. – testman