2010-10-22 19 views
12

Ho passato il mio codice da std :: map a std :: unordered_map dove appropriato. Con std :: map, io di solito scrivo il seguente solo per assicurarsi che la chiave non può essere modificata:Utilizzo di una chiave const per unordered_map

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

Francamente, non ho mai controllato se questo fosse const di qualsiasi valore. Questo ha sempre compilato e lavorato con g ++.

Ora, con std :: unordered_map, il seguente non riesce a collegarsi con g ++ 4.5.1.

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

con questo errore link:

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:

La correzione è semplice, per rimuovere const, ma oltre a questo, c'è anche un punto in STL con una qualsiasi delle classi container associativi per utilizzare un const tipo di chiave? Non ci sono metodi che ti permettono di ottenere un riferimento alla chiave per qualsiasi tipo associativo?

risposta

17

I contenitori associativi espongono la coppia (chiave, valore) come std::pair<const key_type, mapped_type>, quindi il const aggiuntivo sul tipo di chiave è superfluo.

+5

O in altre parole: 'std :: unordered_map ' farà ciò che vuole. (Dice Jonathan, riaffermando l'ovvio.) –

+0

Eh, sì, posso vedere come la mia risposta richiede di guardare la domanda originale per capirlo :) – MSN

Problemi correlati