La norma no lo define del todo, pero v.erase(q)
se define como "Borra el elemento apuntado por q
" en [sequence.reqmts]
. Esto significa que q
realmente debe apuntar a un elemento, que no lo hace el iterador final. Pasar al final del iterador es un comportamiento indefinido.
Por desgracia, tiene que escribir:
auto it = std::find(...);
if (it != <the part of ... that specifies the end of the range searched>) {
v.erase(it);
}
Por supuesto, se podría definir:
template typename<Sequence, Iterator>
Iterator my_erase(Sequence &s, Iterator it) {
if (it == s.end()) return it;
return s.erase(it);
}
my_erase(v, std::find(v.begin(), v.end(), whatever));
c.erase()
en una asociativos vuelve contenedores void
, por lo que la generalización de esta plantilla para todos los contenedores que necesita algo de acción -> decltype
.
+1 para referencia estándar. –
[documentos] (http://www.cplusplus.com/reference/vector/vector/erase/) dice que "borrar elementos en posiciones distintas al vector final hace que el contenedor se reubique ...". Parece que dejar de end() como parámetro. Y en ninguna parte se dijo lo contrario explícitamente. No me gusta esto ... – Pavel
@Pavel: luego tendrás que comentarlo con los autores de "cplusplus.com". Es * no * la documentación de C++, el estándar es la documentación de C++. Pero define 'position' como" Iterator apuntando a un solo elemento ". Un iterador final no apunta a un solo elemento. –