2014-05-23 15 views
8

Gemäß http://www.cplusplus.com/reference/map/map/ kann ich entweder m[k] oder m.at(k) verwenden, um auf den Wert eines Schlüssels k in einer Karte m zuzugreifen. Allerdings, wenn ichStd :: Kartenzugriffsoperator veraltet? no operator [] stimmt mit diesen Operanden überein

derivMap[fx] 

in meinem Code zu tun versuchen, wo derivMap ist ein Element des Typs std::map<std::string,std::string> Visual Studio 2013 gibt mir die Warnung

kein Operator [] entspricht diese Operanden

Allerdings, wenn ich meinen Code

ändern
derivMap.at(fx) 

Ich bekomme keinen Fehler. Haben Sie einen Einblick in dieses Thema?

Antwort

37

map::operator[] ist nicht veraltet.

Ich rate, dass Sie versuchen, den Operator in einem Kontext aufzurufen, in dem derivMapconst ist. map::operator[] hat keine const Überladung, weil es die Karte ändern kann, indem Sie ein Element einfügen, wenn eine Übereinstimmung mit dem Schlüssel nicht vorhanden ist. map::at() auf der anderen Seite, hat eine const Überladung, weil es entworfen ist, zu werfen, wenn ein Element nicht gefunden wird.

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

Ich bevorzuge '.find' zu' .at'. Ich benutze niemals '.at'. –

+0

@MooingDuck Ich denke, es hängt davon ab, ob die Abwesenheit eines Elements ein Fehler ist oder nicht (und ob Sie C++ 11 haben.) – juanchopanza

Verwandte Themen