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 .