Diferencia entre std::remove y vector::erase para vectores

std::remove : en realidad, no elimina elementos del contenedor, sino que solo desvía los elementos no eliminados hacia adelante sobre los elementos eliminados. vector::erase : elimina del vector un solo elemento (posición) o un rango de elementos ([primero, último)).

std::eliminar vs vector::borrar

  • Al usar erase, todos los elementos en un std::vector se desplazarán en 1, lo que provocará una gran cantidad de copias; std::remove hace solo una eliminación ‘lógica’ y deja el vector sin cambios al mover las cosas.
  • Si necesita eliminar varios elementos del vector, std::remove copiará cada elemento, no eliminado, solo una vez a su ubicación final, mientras que el enfoque vector::erase movería todos los elementos desde la posición hasta el final múltiple veces.
  • Por ejemplo, considere eliminar todos los elementos < 5 en el siguiente vector.
std::vector v { 1, 2, 3, 4, 5 };
// remove all elements < 5
  • Usando borrar, si repasó el vector eliminando elementos uno por uno, eliminaría el 1, causando copias de los elementos restantes que se desplazan (4). Luego, eliminaría 2 y cambiaría todos los elementos restantes por uno (3) … si ve el patrón, este es un algoritmo O (N ^ 2) . En el caso de std::remove , el algoritmo mantiene un encabezado e itera sobre el contenedor. Para los primeros 4 elementos, la cabeza se moverá y el elemento se probará, pero no se copiará ningún elemento. Solo para el quinto elemento, el objeto se copiaría de la última a la primera posición, y el algoritmo se completaría con una sola copia y devolvería un iterador a la segunda posición. Este es un algoritmo O(N). El último std::vector::erasecon el rango causará la destrucción de todos los elementos restantes y cambiará el tamaño del contenedor.
  • Por lo tanto, erase() es algo que puede hacer con un elemento en un contenedor, remove() es algo que puede hacer con un rango, ya que reorganiza ese rango pero no borra nada del rango.

CPP

// CPP program to illustrate
// difference b/w std::remove
// and std::vector::erase algorithm
#include <bits/stdc++.h>
 
int main()
{
    std::vector<int> vec{ 10, 20, 30, 30, 20, 10, 10, 20 };
    std::vector<int> ve{ 10, 20, 30, 30, 20, 10, 10, 20 };
 
    // Print original vector
    std::cout << "Original vector :";
    for (int i = 0; i < vec.size(); i++)
        std::cout << " " << vec[i];
    std::cout << "\n";
 
    // Iterator that store the position of last element
    std::vector<int>::iterator pend;
 
    // std :: remove function call
    pend = std::remove(vec.begin(), vec.end(), 20);
 
    // Print the vector after std :: remove
    std::cout << "Range contains:";
    for (std::vector<int>::iterator p = vec.begin(); p != pend; ++p)
        std::cout << ' ' << *p; std::cout << '\n';
 
            // Print original vector
            std::cout << "Original Vector :";
    for (int i = 0; i < ve.size(); i++)
        std::cout << " " << ve[i];
    std::cout << "\n";
 
    // std :: vector :: erase function call
    // erase the first 3 elements of vector
    ve.erase(ve.begin(), ve.begin() + 3);
 
    // Print the vector
    std::cout << "Vector contains :";
    for (int i = 0; i < ve.size(); i++)
        std::cout << " " << ve[i];
    std::cout << "\n";
 
    return 0;
}

Producción:

Original vector : 10 20 30 30 20 10 10 20
Range contains: 10 30 30 10 10

Original Vector : 10 20 30 30 20 10 10 20
Vector contains : 30 20 10 10 20

Referencia: Stack Overflow Este artículo es una contribución de Sachin Bisht . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Veamos la diferencia en forma tabular -:

  estándar::eliminar vector::borrar
1. Se define en el archivo principal <cstdio> Elimina un solo elemento del vector.
2.

Su sintaxis es -:

remove(const char* nombre de archivo);

Su sintaxis es -:

borrado de iterador (posición de const_iterator);

3. Toma un parámetro como nombre de archivo Devuelve un iterador de acceso aleatorio.
4. Devuelve 0 si el archivo se elimina con éxito; de lo contrario, devuelve distinto de cero Su complejidad temporal es O(N)

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *