Cómo llamar a erase con un iterador inverso usando un bucle for

Cómo llamar a erase con un iterador inverso usando un bucle for

erase invalida el iterador, debe reconstruirlo a partir de return of erase:

it = std::map<int,int>::reverse_iterator(testmap.erase( std::next(it).base() ));

o (c++11)

it = decltype(it){testmap.erase( std::next(it).base() )};

Demostración.

Para completar, así es como se ve el bucle corregido de la pregunta original (observe que el incremento del iterador se eliminó del for(...) :

for (auto rit = testmap.rbegin(); rit != testmap.rend(); /* empty */) {
    if (WE_WANT_TO_ERASE(it)) {
        rit = decltype(rit){ testmap.erase(std::next(rit).base()) };
    } else {
        ++rit;
    }
}

Después de algún uso de esta expresión, creo que una modificación al bucle en la respuesta de Jarod42 es para hacer las cosas más seguras y mantener el típico for(;;) sutilezas de bucle:

for (auto it = testcont.rbegin(), nit = it; it != testcont.rend(); it = nit) {
    nit = next(it);

    // whatever... maybe a continue somewhere or maybe not

    if (WE_WANT_TO_ERASE(it)) {
        nit = decltype(it){ testcont.erase(std::next(it).base()) };
    }

    // whatever... maybe a continue somewhere or maybe not
}

Usar el bucle en la otra respuesta es demasiado peligroso. Si uno fuera a agregar sin pensar un continue; en algún lugar del bucle, sin incrementar primero el iterador, el resultado sería un bucle infinito. Dado que, a primera vista, esto puede parecer un for(;;) normal bucle, creo que esto va a suceder tarde o temprano. De manera similar, si hay ramas en el ciclo, y si una de esas ramas no incrementa el iterador, se introduce otro error. Finalmente, si haces un erase() , debe estar seguro a continue antes de incrementar el iterador o de lo contrario tiene otro error.

Usando el bucle modificado de arriba, el bucle se puede tratar como un for(;;) normal círculo. El truco es incrementar nit (el "siguiente iterador") como la primera línea del cuerpo del bucle. Entonces no tienes que preocuparte. La única vez que necesita actualizar nit es si estás haciendo un erase() . Todo lo demás funciona como uno esperaría que funcionara un bucle for.

Una nota final:originalmente hice la pregunta con respecto a los mapas, pero esto funcionará correctamente para vector , list , etc, también.