Namespaces
Variants

std::vector<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++20)
(2)
iterator erase ( iterator first, iterator last ) ;
(hasta C++11)
iterator erase ( const_iterator first, const_iterator last ) ;
(desde C++11)
(constexpr desde C++20)

Borra los elementos especificados del contenedor.

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

Los iteradores (incluyendo el end() iterator) y las referencias a los elementos en o después del punto del borrado quedan invalidados.

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 definen el rango de elementos a eliminar
Requisitos de tipo
-
Si T no es MoveAssignable , el comportamiento es indefinido.

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 retorna el iterador actualizado end() .
Si [ first , last ) es un rango vacío, entonces se devuelve last .

Excepciones

No lanza a menos que se lance una excepción por el operador de asignación de T .

Complejidad

Lineal: el número de llamadas al destructor de T es igual al número de elementos borrados, el operador de asignación de T se llama un número de veces igual al número de elementos en el vector después de los elementos borrados.

Notas

Cuando los elementos del 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 de borrado-eliminación. std::erase_if() reemplaza el idiom de borrado-eliminación. (since C++20)

Ejemplo

#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);
    // Eliminar todos los números pares
    for (std::vector<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 Se aplica a Comportamiento publicado Comportamiento correcto
LWG 151 C++98 first debía ser dereferenciable, lo que
hacía que el comportamiento de borrar un vector vacío fuera indefinido
no requerido si
first == last
LWG 414 C++98 los iteradores en el punto de borrado no se invalidaban también se invalidan

Véase también

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