c++ - oui - Borrando el vector:: fin del vector
mac vendor oui wireshark (3)
Funciona correctamente (no hace nada) cuando uso
vector<T> v;
v.erase(v.end());
Quiero usar algo como
v.erase(std::find(...));
Debería yo if
es v.end()
o no?
No hay información al respecto en C++.com y CPPreference
¿Has probado esto?
v.erase(remove_if(v.begin(), v.end(), (<your criteria>)), v.end());
Borrar el end()
(o para el caso, incluso mirar el objetivo del end()
) es un comportamiento indefinido. El comportamiento indefinido puede tener cualquier comportamiento, incluido "solo trabajo" en su plataforma. Eso no significa que deberías estar haciéndolo; todavía es un comportamiento indefinido, y voy a morderte de la peor manera cuando menos lo esperes más adelante.
Dependiendo de lo que esté haciendo, le recomendamos que considere set
o unordered_set
lugar de vector
aquí.
El estándar 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
debe apuntar a un elemento, lo que no ocurre con el iterador final. Pasar al final del iterador es un comportamiento indefinido.
Desafortunadamente, necesitas escribir:
auto it = std::find(...);
if (it != <the part of ... that specifies the end of the range searched>) {
v.erase(it);
}
Por supuesto, podrías 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 un contenedor asociativo devuelve void
, por lo que para generalizar esta plantilla para todos los contenedores necesita algo -> decltype
acción -> decltype
.