2013-03-27 3 views
13

perche la seguente situazione:Come rimuovere più oggetti dalla mappa non ordinata mentre si scorre su di esso?

Ora sto iterazione di questa mappa non ordinata:

for (auto it = elements.begin(); it != elements.end(); ++it) 

All'interno del ciclo, sto formando cluster di diversi elementi di elements (l'attuale uno che sia it punti e altro ancora, non necessariamente quelli successivi!). Poiché ogni elemento può essere solo parte di un cluster, vorrei rimuovere quelli dalla mappa e quindi continuare con l'elemento successivo (ad esempio, creare il prossimo cluster).

Come posso fare questo e continuare l'iterazione nella posizione corretta?

+0

Correlato: http://stackoverflow.com/q/596162/46821 –

risposta

3

La funzione erase restituisce l'iteratore dopo l'elemento rimosso (tutte le funzioni di raccolta erase). Puoi usarlo per continuare.

Ricordarsi di non aumentare l'iteratore nel caso in cui si cancella un elemento, o si passerà sopra un elemento.

+0

'set :: erase()' restituisce il numero di elementi rimossi. – trojanfoe

+0

@trojanfoe Non in C++ 11. –

+0

O dovrei dire "la versione basata sul valore di' erase() 'restituisce il numero di elementi rimossi". È un po 'fuorviante dire "tutte le funzioni di cancellazione delle collezioni" fa ". – trojanfoe

15

unordered_map::erase restituirà l'iteratore oltre l'elemento eliminato.

Si vorrebbe codice lungo le linee di:

it = myMap.erase(it); 

Nota importante: Se si sta facendo questo all'interno di un ciclo, si vuole fare in modo che si evitare l'incremento tipica di it alla fine del ciclo se questo è fatto.

+0

Vedere l'esempio concreto sopra http://stackoverflow.com/a/15662547/1529139 – 56ka

16
for (auto it = elements.begin(); it != elements.end();) { 
    if(you have to rease) { 
     it = elements.erase(it); 
    } 
    else 
     it++; 
} 

In questo modo si assicura di non aumentare dopo la cancellazione e non si incrementa la fine().

Dopo aver suggerito che c'è no good reason da avere per ciclo che non incrementa nulla ci si potrebbe volere un ciclo while invece. Principalmente per una maggiore leggibilità.

+2

Stile nitpick: c'è [nessuna buona ragione] (http://stackoverflow.com/q/1379246/46821) per avere un ciclo for questo non incrementa nulla. Questo probabilmente sarebbe meglio come un ciclo temporale. –

+0

Grazie per il suggerimento. –

+14

@MichaelKristofik Il ciclo for è utile qui; Serve allo scopo di inizializzare l'iteratore e limitarne l'ambito. – csl