Namespaces
Variants

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

From cppreference.net

(1)
iterator erase ( iterator pos ) ;
(hasta C++11)
iterator erase ( const_iterator pos ) ;
(desde C++11)
(constexpr desde C++26)
(2)
iterator erase ( iterator first, iterator last ) ;
(hasta C++11)
iterator erase ( const_iterator first, const_iterator last ) ;
(desde C++11)
(constexpr desde C++26)

Borra los elementos especificados del contenedor.

1) Elimina el elemento en la posición pos .
2) Elimina los elementos en el rango [ first , last ) .

Las referencias e iteradores a los elementos eliminados quedan invalidados. Otras referencias e iteradores no se ven afectados.

El iterador pos debe ser válido y dereferenciable. Por lo tanto, el iterador end() (que es válido, pero no es dereferenciable) no puede usarse como valor para pos .

El iterador first no necesita ser desreferenciable si first == last : eliminar un rango vacío es una operación nula.

Contenidos

Parámetros

pos - iterador al elemento a eliminar
first, last - el par de iteradores que define el rango de elementos a eliminar

Valor de retorno

Iterador que sigue al último elemento eliminado.

1) Si pos se refiere al último elemento, entonces se devuelve el iterador end() .
2) Si last == end ( ) antes de la eliminación, entonces se devuelve el iterador actualizado end() .
Si [ first , last ) es un rango vacío, entonces se devuelve last .

Complejidad

1) Constante.
2) Lineal en la distancia entre first y last .

Notas

Cuando los elementos de un contenedor necesitan ser eliminados basándose en un predicado, en lugar de iterar el contenedor y llamar al borrado unario erase , generalmente se utiliza la sobrecarga de rango de iteradores con std::remove()/std::remove_if() para minimizar el número de movimientos de los elementos restantes (no eliminados), — este es el idiom erase-remove. std::erase_if() reemplaza el idiom erase-remove. (desde C++20)

Ejemplo

#include <list>
#include <iostream>
#include <iterator>
void print_container(const std::list<int>& c)
{
    for (int i : c)
        std::cout << i << ' ';
    std::cout << '\n';
}
int main()
{
    std::list<int> c{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    print_container(c);
    c.erase(c.begin());
    print_container(c);
    std::list<int>::iterator range_begin = c.begin();
    std::list<int>::iterator range_end = c.begin();
    std::advance(range_begin, 2);
    std::advance(range_end, 5);
    c.erase(range_begin, range_end);
    print_container(c);
    // Eliminar todos los números pares
    for (std::list<int>::iterator it = c.begin(); it != c.end();)
    {
        if (*it % 2 == 0)
            it = c.erase(it);
        else
            ++it;
    }
    print_container(c);
}

Salida:

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

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 151 C++98 first se requería que fuera dereferenciable, lo que
hacía que el comportamiento de borrar un list vacío fuera indefinido
no requerido si
first == last

Véase también

elimina todos los elementos que cumplen criterios específicos
(plantilla de función)
borra el contenido
(función miembro pública)