2012-05-21 11 views
9

Io uso qualcosa di simile:Qual è il valore restituito da map :: begin() per una mappa vuota?

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

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

Mi stavo chiedendo se questo avrebbe funzionato anche se la carta è vuota. Non sono riuscito a trovare alcuna informazione sul ritorno di map :: begin() se la mappa è vuota.

+0

Posso suggerire di creare un piccolo programma per testarlo? –

+1

'std :: distance (begin, end)' sarà zero. –

+0

Bello! Non ero a conoscenza di questa funzione. – HWende

risposta

15

Se la mappa è vuota, gli iteratori begin e end sono uguali, ovvero restituisce mymap->end().

+0

Questo è vero, e dovresti sempre confrontare l'iteratore restituito da 'begin()' a 'end()' prima di usarlo se la mappa potrebbe essere stata vuota (nota come il tuo ciclo usa 'while() ...' not 'do ... while()', quindi verifica correttamente prima di eseguire l'istruzione controllata). Chiedete qual è il valore - potrebbe essere qualsiasi cosa purché sia ​​paragonabile a 'end()' e incorporando la necessità per gli iteratori di differire gli elementi effettivi ... lo standard lascia il compilatore/implementazione per scegliere un valore adatto. –

+0

Suppongo che sia meglio testare 'map :: empty()' no? –

-1

Non si deve provare ad incrementare un iteratore in passato, O DEREFERENCE un iteratore su una mappa vuota, ecco perché è necessario avere istruzioni nel proprio codice per controllare la mappa e/o l'iteratore prima di utilizzarlo.

+0

Un'istruzione 'if' non è l'unico tipo di condizionale, anche il' while' usato nella domanda funzionerà bene. –

+0

Per la mappa vuota sarà 'it == end'. Quindi il codice non entrerà durante il ciclo. Significa che non avrai problemi con l'iteratore di dereferenziamento. –

Problemi correlati