std::vector<T,Allocator>:: erase
| (1) | ||
|
iterator erase
(
iterator pos
)
;
|
(jusqu'en C++11) | |
|
iterator erase
(
const_iterator pos
)
;
|
(depuis C++11)
(constexpr depuis C++20) |
|
| (2) | ||
|
iterator erase
(
iterator first, iterator last
)
;
|
(jusqu'en C++11) | |
|
iterator erase
(
const_iterator first, const_iterator last
)
;
|
(depuis C++11)
(constexpr depuis C++20) |
|
Efface les éléments spécifiés du conteneur.
[
first
,
last
)
.
Les itérateurs (y compris l'itérateur
end()
) et les références aux éléments situés au niveau ou après le point d'effacement sont invalidés.
L'itérateur pos doit être valide et déréférençable. Ainsi l'itérateur end() (qui est valide, mais n'est pas déréférençable) ne peut pas être utilisé comme valeur pour pos .
L'itérateur first n'a pas besoin d'être déréférençable si first == last : effacer une plage vide est une opération sans effet.
Table des matières |
Paramètres
| pos | - | itérateur vers l'élément à supprimer |
| first, last | - | la paire d'itérateurs définissant l'intervalle des éléments à supprimer |
| Exigences de type | ||
-
T
n'est pas
MoveAssignable
, le comportement est indéfini.
|
||
Valeur de retour
Itérateur suivant le dernier élément supprimé.
[
first
,
last
)
est une plage vide, alors
last
est retourné.
Exceptions
Ne lance pas sauf si une exception est levée par l'opérateur d'affectation de
T
.
Complexité
Linéaire : le nombre d'appels au destructeur de
T
est le même que le nombre d'éléments effacés, l'opérateur d'affectation de
T
est appelé un nombre de fois égal au nombre d'éléments dans le vecteur après les éléments effacés.
Notes
Lorsque des éléments d'un conteneur doivent être supprimés selon un prédicat, plutôt que de parcourir le conteneur et d'appeler l'opération unaire
erase
, la surcharge prenant une plage d'itérateurs est généralement utilisée avec
std::remove()/std::remove_if()
pour minimiser le nombre de déplacements des éléments restants (non supprimés) — c'est l'idiome erase-remove.
std::erase_if()
remplace l'idiome erase-remove.
(depuis C++20)
Exemple
#include <vector> #include <iostream> void print_container(const std::vector<int>& c) { for (int i : c) std::cout << i << ' '; std::cout << '\n'; } int main() { std::vector<int> c{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; print_container(c); c.erase(c.begin()); print_container(c); c.erase(c.begin() + 2, c.begin() + 5); print_container(c); // Effacer tous les nombres pairs for (std::vector<int>::iterator it = c.begin(); it != c.end();) { if (*it % 2 == 0) it = c.erase(it); else ++it; } print_container(c); }
Sortie :
0 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 6 7 8 9 1 7 9
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 151 | C++98 |
first
était requis d'être déréférençable, ce qui
rendait le comportement de vider un
vector
vide indéfini
|
non requis si
first == last |
| LWG 414 | C++98 | les itérateurs au point d'effacement n'étaient pas invalidés | ils sont également invalidés |
Voir aussi
|
efface tous les éléments satisfaisant des critères spécifiques
(modèle de fonction) |
|
|
efface le contenu
(fonction membre publique) |