2010-10-22 5 views
12

Ich habe meinen Code von std :: map zu std :: unordered_map, wo angemessen. Mit std :: map, ich schreibe normalerweise die folgenden nur um sicherzustellen, dass der Schlüssel nicht geändert werden kann:Verwenden einer Const-Taste für unordered_map

std::map<const std::string, int> 

Ehrlich gesagt, ich nie geprüft, ob diese const von Wert war. Dies hat immer mit g ++ kompiliert und gearbeitet.

Nun, mit std :: unordered_map, die folgenden Links nicht mit g ++ 4.5.1.

std::unordered_map<const std::string, std::string> m; 
m["foo"] = "bar"; 

mit diesem Link-Fehler:

Undefined symbols: "std::hash<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const>::operator()(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const" , referenced from:

Die Lösung ist einfach, zu entfernen const, aber abgesehen davon, gibt es auch einen Punkt in STL mit einem der assoziativen Containerklassen eine const verwenden Schlüsselart? Gibt es keine Methoden, mit denen Sie einen Verweis auf den Schlüssel für einen assoziativen Typ erhalten können?

Antwort

17

Die assoziativen Container geben nur das (Schlüssel, Wert) Paar als std::pair<const key_type, mapped_type> frei, so dass die zusätzliche const auf den Schlüsseltyp überflüssig ist.

+5

Oder mit anderen Worten: 'std :: unordered_map ' wird tun, was er will. (Sagt Jonathan und wiederholt das Offensichtliche zu den meisten.) –

+0

Heh, ja, ich kann sehen, wie meine Antwort es erfordert, die ursprüngliche Frage zu betrachten, um sie zu verstehen :) – MSN

Verwandte Themen