Código (cpp) [Seleccionar]
if((*it) == borrar){
NomEst.erase(it);
--it;
Una vez que haces "erase", el iterador que has utilizado deja de ser válido, ya que el elemento al que apunta deja de pertenecer al vector. Cualquier operación sobre ese vector que realices después del "erase" es una operación no válida.
Para hacer esto tienes varias opciones. Yo te comento dos de ellas:
1. Creas un iterador temporal y después borras el elemento. De esta forma conservas un iterador válido después de la operación:
Código (cpp) [Seleccionar]
if((*it) == borrar){
std::vector< std::string > itTemp = it--;
NomEst.erase( itTemp );
Porque claro, el iterador sobre el que se hace "erase" deja de ser válido... pero el resto de iteradores siguen siendo totalmente válidos.
El problema que tiene este sistema es que si intentas eliminar el primer elemento del vector, it-- resulta entonces en una operación no válida. Puedes intentar hacer una lógica un poco más completa para detectar esta situación y actuar en consecuencia, o puedes pasar a la otra opción.
2. Hacer uso de la STL para marcar los elementos a borrar. Hay una función en la STL llamada "remove". Esta función itera un contenedor y ejecuta una comprobación sobre cada elemento. Si la condición resulta positiva, marca el elemento para eliminar. Al finalizar la función, los elementos a borrar se encontrarán al final del vector, por lo que nos podemos cargar todos de un plumazo borrando un rango de iteradores.
Código (cpp) [Seleccionar]
std::vector< std::string > itEnd = std::remove( NomEst.begin( ), NomEst.end( ), nombre );
NomEst.erase( itEnd, NomEst.end( ) );
"remove" pertenece a la librería "algorithm"
También existe la función "remove_if". Si bien esta variante es mucho más potente, puesto que permite usar una función personalizada para detectar los elementos a eliminar, es un pelín más compleja de usar y no merece la pena en este caso tan sencillo. Te lo comento por si te pica la curiosidad y quieres investigar un poco más sobre el tema.
En cuanto a tu problema con la búsqueda... fflush no se puede usar con buffer de entrada y stdin es un buffer de entrada. Conclusión, esa línea no debería estar en tu programa. Si necesitas borrar el buffer de entrada hay otros mecanismos, buscando en google encontrarás algunos), pero no creo que necesites limpiarlo en tu caso.
Un saludo.