2011-12-24 7 views
10

Quiero borrar un elemento de un contenedor que se usa actualmente dentro de un bucle for basado en rangos. ¿Esto causará un comportamiento indefinido? ¿O será el próximo valor de element después de erase() ser el próximo elemento si no llamé al erase()?Borrar un elemento de un contenedor mientras está dentro de un bucle for-

Ejemplo:

std::map<int, int> someMap; 
/* Fill in someMap */ 
for (auto& element : someMap) 
{ 
    /* ... */ 
    if (/* Some condition */) 
     someMap.erase(element.first); 
} 

Respuesta

12

Debe ser un comportamiento indefinido. Porque, de acuerdo con 14882/2011, el enunciado basado en rango es equivalente a:

auto && __range = range-init; 
for (auto __begin = begin-expr(__range), 
    __end = end-expr(__range); 
    __begin != __end; 
    ++__begin) { 
    for-range-declaration = *__begin; 
    statement 
} 
Cuestiones relacionadas