Uso de std :: deque :: iterator (en C ++ STL) para buscar y eliminar ciertos elementos

He encontrado un problema al invocar el siguiente código:

#include<deque>
using namespace std;

deque<int> deq = {0,1,2,3,4,5,6,7,8};

for(auto it = deq.begin(); it != deq.end(); it++){
    if(*it%2 == 0)
        deq.erase(it);
}

que dio lugar a una falla de segmentación. Después de analizar el problema, descubrí que el problema reside en la forma en que el STL administra los iteradores para los deques: si el elemento que se está borrando está más cerca del final del deque, el iterador que se usa para señalar el elemento borrado ahora apuntará hacia el SIGUIENTE elemento, pero no el elemento anterior comovector::iterator hace. Entiendo que la modificación de la condición de bucle deit != deq.end() ait < deq.end() posiblemente podría resolver el problema, pero me pregunto si hay una manera de atravesar y borrar cierto elemento en un deque en la "forma estándar" para que el código también sea compatible con otros tipos de contenedores.

Respuestas a la pregunta(2)

Su respuesta a la pregunta