📜  std :: remove和vector :: erase之间的区别

📅  最后修改于: 2021-05-30 09:02:39             🧑  作者: Mango

std :: remove:它实际上并没有从容器中删除元素,而只是将未删除的元素向前转移到已删除元素的顶部。

vector :: erase:从向量中删除单个元素(位置)或一系列元素([first,last))。

std :: remove vs vector :: erase

  1. 通过使用擦除,std :: vector中的所有元素将移位1,从而导致大量复制; std :: remove只是执行“逻辑”删除,并通过四处移动来使向量保持不变。
  2. 如果您需要从向量中删除多个元素,则std :: remove会将每个未被删除的元素仅复制一次到其最终位置,而vector :: erase方法会将所有元素从位置移动到最后的多个时代。
  3. 例如,考虑删除以下向量中所有<5的元素。
    std::vector v { 1, 2, 3, 4, 5 };
    // remove all elements < 5
    

    使用擦除,如果您一遍又一遍地删除了矢量删除元素,则将删除1,导致其余元素的副本移位(4)。然后,您将删除2并将所有剩余元素移动一(3)…如果看到模式,则这是O(N ^ 2)算法

    在std :: remove的情况下,该算法将保持一个头部,并在容器上进行迭代。对于前四个元素,将移动磁头并测试该元素,但不会复制任何元素。仅对于第五个元素,对象将从最后一个位置复制到第一个位置,并且算法将完成一个副本并将迭代器返回第二个位置。这是一个O(N)算法。后面带有范围的std :: vector :: erase将导致所有其余元素的破坏并调整容器的大小。

  4. 因此,对容器中的元素可以执行擦除()操作,对范围进行删除()操作,因为它会重新排列该范围,但不会擦除该范围内的任何内容。
// CPP program to illustrate
// difference b/w std::remove
// and std::vector::erase algorithm
#include 
  
int main()
{
    std::vector vec{ 10, 20, 30, 30, 20, 10, 10, 20 };
    std::vector 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::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::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 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;
}

输出:

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

参考:堆栈溢出

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”