www oui mac_find mac coffer coffe address c++ vector iterator language-lawyer erase

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 .