2016-03-24 26 views
5

Desidero cancellare gli elementi di std :: map da beginIt a endIt. cancella la funzione restituisce l'iteratore all'elemento che segue l'ultimo elemento rimosso. non è fine? Perché la cancellazione restituisce l'iteratore?Perché map.erase restituisce l'iteratore?

auto it = m_map.erase(beginIt, endIt); 

risposta

2

Credo che ciò sia dovuto al tentativo di unificare le chiamate di funzione tra i tipi di contenitore standard. Ad esempio, in un std::vector l'iteratore restituito non è uguale a endIt

+0

C'è un caso per la std :: map dove (it! = EndIt)? –

+0

Perché stai dicendo questo? 'std :: vector :: erase' restituisce l'iteratore seguendo l'ultimo elemento rimosso, lo stesso di' std :: map :: erase'. – SergeyA

+1

@SergeyA 'std :: map :: erase (beg, end)' restituisce 'end'. 'std :: vector :: erase (beg, end)' restituisce iteratore all'elemento 'end' stava puntando, non' end' stesso. –

8

È una funzionalità utile che la libreria standard C++ adotta per tutti i suoi contenitori.

Un buon utilizzo, in particolare, è quando si elimina un insieme di elementi soggetti a un vincolo e si sta iterando su tutto il contenitore. Ovviamente l'eliminazione di qualcosa da un contenitore invalida l'iteratore che hai passato. Per restituire il prossimo iteratore candidato è utile.

+0

È sempre vero solo per le funzioni a argomento singolo e per i due argomenti per alcuni contenitori. La cancellazione di due argomenti sulla mappa non invalida 'endIt' –

+0

Non è utile per cancellare la mappa sulla mappa in alcun modo. – SergeyA

+3

Inoltre non è utile quando stai preparando una tazza di tè. Ma è ancora utile in molti casi. – Bathsheba