std::remove :它实际上并没有从容器中删除元素,而只是在已删除元素的顶部分流未删除的元素。
vector::erase :从向量中删除单个元素(位置)或一系列元素([first, last))。
std::remove 与 vector::erase
- 通过使用擦除 std::vector 中的所有元素将被移动 1 导致大量副本; std::remove 只是一个“逻辑”删除,并通过移动东西使向量保持不变。
- 如果您需要从向量中删除多个元素,std::remove 会将每个未删除的元素仅复制一次到其最终位置,而 vector::erase 方法会将所有元素从位置移动到结尾多个次。
- 例如,考虑删除以下向量中所有 < 5 的元素。
std::vector v { 1, 2, 3, 4, 5 }; // remove all elements < 5
使用擦除,如果你一个一个地遍历向量删除元素,你将删除 1,导致剩余元素的副本被移动 (4)。然后您将删除 2 并将所有剩余元素移动一 (3) ……如果您看到该模式,这是一个O(N^2) 算法。
在 std::remove的情况下,算法维护一个头部,并遍历容器。对于前 4 个元素,将移动头部并测试元素,但不会复制任何元素。只有对于第五个元素,对象才会从最后一个位置复制到第一个位置,算法将完成一个副本,并返回一个迭代器到第二个位置。这是一个 O(N) 算法。后面带有范围的 std::vector::erase将导致所有剩余元素的销毁并调整容器的大小。
- 因此,erase() 是您可以对容器中的元素执行的操作,remove() 是您可以对范围执行的操作,因为它会重新排列该范围但不会从该范围中删除任何内容。
// 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 等的准备工作,请参阅完整的面试准备课程。