2014-05-23 11 views
8

In base a http://www.cplusplus.com/reference/map/map/, è possibile utilizzare m[k] o m.at(k) per accedere al valore di una chiave in una mappa m. Tuttavia, quando provo a farestd :: Operatore di accesso alla mappa deprecato? nessun operatore [] corrisponde a questi operandi

derivMap[fx] 

nel mio codice, in cui derivMap è un elemento di tipo std::map<std::string,std::string> Visual Studio 2013 mi dà l'avviso

nessun operatore [] corrisponde a questi operandi

Tuttavia, quando cambio il mio codice per

derivMap.at(fx) 

Non ho alcun errore. Avete qualche idea di questo problema?

risposta

37

map::operator[] non è deprecato.

Indovino che si sta tentando di chiamare l'operatore in un contesto in cui derivMap è const. map::operator[] non ha un sovraccarico const, perché può modificare la mappa inserendo un elemento quando non è presente una corrispondenza della chiave. map::at() d'altra parte, ha un sovraccarico const perché è progettato per lanciare quando un elemento non viene trovato.

void foo(std::map<int, int>& m) 
{ 
    int n = m[42]; // OK 
} 

void bar(const std::map<int, int>& m) 
{ 
    int n = m[42]; // ERROR 
} 
+1

Preferisco '.find' a' .at'. Non uso mai '.at'. –

+0

@MooingDuck Suppongo che dipenda dal fatto che l'assenza di un elemento sia un errore o meno (e se si abbia C++ 11). – juanchopanza

Problemi correlati