2009-05-13 8 views
3

Ich habe gerade herausgefunden, dass, wenn ich eine Karte suchen wie:STL Karte speichert gesucht Schlüssel

std::map<std::string, int> aMap; 

die Schlüssel ich anfangen zu suchen Teil der Karte zu sein. Im obigen Fall werden die Werte als Nullen gespeichert. Im Falle von Zeigern speichert er die Werte als 0 bewertet Zeiger

Ich mache die Suche mit dem Operator [], wie in:

int a = aMap["some key"]; 

Können Sie dies bestätigen? Ich denke, ich habe den Operator [] falsch interpretiert. Machst du eine Aufgabe?

Wo kann ich STL Dokumentation dieser Art von „Features“ finden?

Antwort

8

Suchen Sie mit dem Operator []? Wenn ja, dann ist das das definierte Verhalten.

Sie sollten die Methode "find" verwenden, wenn Sie dieses Verhalten nicht möchten.

Eine gute Referenz für die STL ist der Nicolai Josuttis Buch.

1

Wie suchen Sie ???

if(!aMap[key]) // not found 

Dies ist nicht korrekt, wenn Sie eine Karte über Operator Zugriff [] der apropriate Ort erstellt wird und die Referenz zurückgegeben.

Sie benötigen

if(aMao.find(key)==aMap.end()) // not found 
1

Es klingt verwenden, wie Sie eckigen Klammern verwenden, das heißt

if (aMap["string"] == something) 

Tu das nicht. Verwenden Sie stattdessen map :: find.

Der Halter wird von einem Operator automatisch den Schlüssel in die Karte ein, wenn es nicht vorhanden ist, die Standardeinstellung für den Wert Teil verwendet wird.

3

Wenn Sie in der Karte sehen Sie die [] Operator, dann, ja, werden Sie Standardobjekte erzeugen. Wenn Sie "finden" verwenden, ist dies nicht der Fall. Dies liegt daran, dass der [] -Operator einen Verweis auf ein Objekt in der Map zurückgeben muss, so dass er keine andere Wahl hat, als einen zu generieren, wenn einer noch nicht vorhanden ist.

1

Wenn von Such Sie Betreibers mit [], wie folgt aus:

if (m["foo"] == 42) { 
    // found 
} 
else { 
    // not 
} 

dann ja, das einen Eintrag für „foo“ erstellen, wenn es nicht bereits vorhanden ist. Aus diesem Grund sollten Sie im Allgemeinen vermeiden, den Operator [] für Maps zu verwenden und stattdessen die benannte Funktion sfind() und insert() zu verwenden.

Was wo zu diesem Verhalten Informationen, um herauszufinden, das beste Buch über die Standard-Bibliothek ist The C++ Standard Library by Nicolai Josuttis.

2

Die Überlegung dahinter ist: [] ist definiert als

T& operator[](KEY k) 

Eine Referenz nie NULL sein kann, so muss ein Wert zurückgegeben werden. STL löst dies, indem ein standardmäßiges initialisiertes Element eingefügt wird.

2
int a = aMap["some key"]; 

Hier prüft die Karte zu sehen, ob die Taste „einig Schlüssel“ existiert, ist bereits die Karte:

  • wenn ja dann die Referenz von der Wert auf den „Some Schlüssel“, entsprechend zurückgeführt wird.
  • Wenn "ein Schlüssel" in der Karte nicht vorhanden ist, wird der Schlüssel "Some Key" in der Karte mit dem Standardwert eingefügt. Referenz des neu eingefügten Werts wird zurückgegeben.

Die richtige Art und Weise, ob ein Schlüssel-Exits in der Karte testen (ohne den Schlüssel Hinzufügen zur Karte) ist:

std::map<key,value>::iterator iter = myMap.find("Some Key"); 
if(iter != myMap.end()) 
{ 
//key exists 
} 
else 
{ 
//no key 
} 
Verwandte Themen