2012-05-21 4 views
9

ich so etwas wie diese:Was ist der Rückgabewert von map :: begin() für eine leere Map?

map<string, Data>::iterator it = mymap->begin(); 
map<string, Data>::iterator end = mymap->end(); 

while (it != end) { 
    // do stuff 
    ++it; 
} 

Ich habe mich nur gefragt, ob dies auch funktionieren würde, wenn die Karte leer ist. Ich konnte keine Informationen über die Rückgabe von map :: begin() finden, wenn die Karte leer ist.

+0

Kann ich vorschlagen, nur ein kleines Programm zu erstellen, um es nur zu testen? –

+1

'std :: distance (Anfang, Ende)' wird Null sein. –

+0

Schön! Ich war mir dieser Funktion nicht bewusst. – HWende

Antwort

15

Wenn die Karte leer ist, sind die begin und end Iteratoren gleich, d. H. Gibt mymap->end() zurück.

+0

Das ist richtig, und Sie sollten immer den Iterator vergleichen, der von 'begin()' nach 'end()' zurückgegeben wird, bevor Sie ihn verwenden, wenn die Map leer war (beachten Sie, dass Ihre Schleife 'while() ...' nicht verwendet) 'do ... while()', so testet es korrekt, bevor die kontrollierte Anweisung ausgeführt wird. Sie fragen, was ist der Wert - es könnte alles sein, vergleicht es gleich "end()", und mit der Notwendigkeit für Iteratoren zu tatsächlichen Elementen zu unterscheiden ... der Standard überlässt der Compiler/Implementierung einen geeigneten Wert zu wählen. –

+0

Ich denke es ist besser, 'map :: empty()' zu testen, oder? –

-1

ODER DEREFERENCE ein Iterator zu einer leeren Map. Sie müssen also If-Anweisungen in Ihrem Code haben, um die Map und/oder den Iterator zu überprüfen, bevor Sie sie verwenden.

+0

Eine 'if'-Anweisung ist nicht die einzige Art von Bedingung, die in der Frage verwendete' while' funktioniert ebenfalls gut. –

+0

Für leere Karte wird 'it == Ende'. Also Code wird nicht während while-Schleife eingeben. Dies bedeutet, dass Sie kein Problem mit dem Dereferenzierungs-Iterator haben werden. –

Verwandte Themen