Recientemente aprendí sobre la forma correcta de trabajar con iteradores inversos en C++ (específicamente cuando necesitas borrar uno). (Ver this question y this one.)Use un iterador regular para iterar hacia atrás, o luchar con reverse_iterator?
Ésta es la forma en que se supone que hacerlo:
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());
}
Pero yo creo
pensaron que esto es mucho mejor (No haga esto, no estándares compatibles, como señala MooingDuck out):
for (IV::iterator it = iv.end(), begin = iv.begin();
it-- != begin;)
{
// Use 'it' for anything you want
*it += 10;
iv.erase(it);
}
Contras:
-
Dígame. ¿Qué tiene de malo? - No cumple con los estándares, como señala MooingDuck. Eso prácticamente anula cualquiera de las posibles ventajas a continuación.
Pros:
- Utiliza un lenguaje familiar para inversa para bucles
- no tiene que recordar (o explicar) la
+1
- Menos escribir
- Obras para std: : list too too:
it = il.erase(it);
- Si borra un elemento, no tiene que ajustar el iterador
- Si borra, usted no tiene que volver a calcular el iterador comenzar
¿Se refiere además al hecho de que esto es un comportamiento indefinido y fallará/colapsará en situaciones comunes? Pruébalo con un 'mapa' vacío. –
cuidado para elaborar en una respuesta? ¿El UB está decrementando un iterador de entrada o disminuyendo después del comienzo? ¿Es UB para todos los contenedores? – Dan
No se puede disminuir un iterador de entrada o salida (se me olvidó ese, buen ojo), y tampoco se puede disminuir pasado el principio para ningún contenedor. –