Recentemente ho imparato a conoscere il modo giusto di lavorare con gli iteratori inversi in C++ (in particolare quando è necessario cancellarne uno). (Vedere this question e this one.)Utilizzare un iteratore normale per iterare all'indietro o lottare con reverse_iterator?
Questo è come si suppone di farlo:
typedef std::vector<int> IV;
for (IV::reverse_iterator rit = iv.rbegin(), rend = iv.rend();
rit != rend; ++rit)
{
// Use 'rit' if a reverse_iterator is good enough, e.g.,
*rit += 10;
// Use (rit + 1).base() if you need a regular iterator e.g.,
iv.erase((rit + 1).base());
}
Ma io penso
pensato che questo è molto meglio (non fare questo, non standard compliant, come fa notare MooingDuck):
for (IV::iterator it = iv.end(), begin = iv.begin();
it-- != begin;)
{
// Use 'it' for anything you want
*it += 10;
iv.erase(it);
}
Contro:
-
Dimmi. Cosa c'è di sbagliato in questo? - Non è conforme agli standard, come sottolinea MooingDuck. Di seguito si annulla praticamente uno dei possibili vantaggi.
Pro:
- Utilizza un linguaggio familiare per inversione per-loop
- non c'è bisogno di ricordare (o spiegare) il
+1
- Meno digitando
- Works for std: : lista anche:
it = il.erase(it);
- Se si cancella un elemento, non è necessario regolare l'iteratore
- Se si cancella, non c'è bisogno di ricalcolare l'iteratore
Intendi inoltre il fatto che si tratti di comportamento indefinito e che si verificherà un errore/arresto anomalo in situazioni comuni? Provalo con una 'mappa' vuota. –
cura di elaborare in una risposta? L'UB sta decrementando un iteratore di input o decrementando oltre l'inizio? È UB per tutti i contenitori? – Dan
Impossibile decrementare un input o un iteratore di output (l'ho dimenticato, buon occhio) e non è possibile decrementare l'inizio per nessun contenitore. –