Namespaces
Variants

std::deque<T,Allocator>:: erase

From cppreference.net

(1)
iterator erase ( iterator pos ) ;
(jusqu'en C++11)
iterator erase ( const_iterator pos ) ;
(depuis C++11)
(constexpr depuis C++26)
(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++26)

Efface les éléments spécifiés du conteneur.

1) Supprime l'élément à la position pos .
2) Supprime les éléments dans l'intervalle [ first , last ) .

Tous les itérateurs et références sont invalidés, sauf si les éléments effacés se trouvent à la fin ou au début du conteneur, auquel cas seuls les itérateurs et références vers les éléments effacés sont invalidés. L'itérateur end() est également invalidé, sauf si les éléments effacés se trouvent au début du conteneur et que le dernier élément n'est pas effacé.

L'itérateur pos doit être valide et déréférençable. Par conséquent, l'itérateur end() (qui est valide mais non 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
-
Si T n'est pas MoveAssignable , le comportement est indéfini.

Valeur de retour

Itérateur suivant le dernier élément supprimé.

1) Si pos fait référence au dernier élément, alors l'itérateur end() est retourné.
2) Si last == end ( ) avant la suppression, alors l'itérateur end() mis à jour est retourné.
Si [ 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, le nombre d'appels à l'opérateur d'affectation de T ne dépasse pas le plus petit entre le nombre d'éléments avant les éléments effacés et le nombre d'éléments 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 <deque>
#include <iostream>
void print_container(const std::deque<int>& c)
{
    for (int i : c)
        std::cout << i << ' ';
    std::cout << '\n';
}
int main()
{
    std::deque<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::deque<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 S'applique à Comportement tel que publié Comportement corrigé
LWG 151 C++98 first devait être déréférençable, ce qui
rendait le comportement de vidage d'un deque vide non défini
non requis si
first == last
LWG 638 C++98 l'itérateur past-the-end n'était pas invalidé il est invalidé si les éléments sont
effacés du milieu ou de la fin

Voir aussi

efface tous les éléments satisfaisant des critères spécifiques
(modèle de fonction)
efface le contenu
(fonction membre publique)