L'effacement de vecteur::fin de vecteur
Ça fonctionne correct(ne fait rien) quand j'utilise
vector<T> v;
v.erase(v.end());
Je veux utiliser quelque chose comme
v.erase(std::find(...));
Dois-je if
est-il v.end()
ou pas?
Il n'y a pas d'info à ce sujet sur C++.com et CPPreference
Vous devez vous connecter pour publier un commentaire.
La norme n'est pas tout à fait le préciser, mais
v.erase(q)
est défini, "Efface l'élément pointé parq
" dans[sequence.reqmts]
. Cela signifie queq
doit pointer vers un élément qui, à la fin de l'itérateur n'est pas. En passant la fin de l'itérateur est un comportement indéfini.Malheureusement, vous devez écrire:
Bien sûr, vous pouvez définir:
c.erase()
sur un conteneur associatif renvoievoid
, afin de généraliser ce modèle à tous les conteneurs vous avez besoin de quelques-> decltype
action.position
comme "Itérateur pointant sur un seul élément". Une fin d'itérateur ne pointe pas sur un seul élément.end() - 1
au lieu de "vecteur"de fin.Effacement
end()
(ou, d'ailleurs, même en regardant la cible deend()
) est un comportement indéfini. Un comportement indéfini est autorisé à avoir tout comportement, y compris "fonctionne" sur votre plate-forme. Cela ne signifie pas que vous devriez faire, c'est encore un comportement indéfini, et je vais venir vous mordre dans le pire des façons lorsque vous êtes à moins de s'attendre à plus tard.En fonction de ce que vous faites, vous pourriez envisager de
set
ouunordered_set
au lieu devector
ici.{ auto it = v.find(x); if (it != x.end()) { v.erase(it); } }
pop_back
)Avez-vous essayé ceci?
remove_if
, je suppose