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

📅  最后修改于: 2023-12-03 14:47:42.696000             🧑  作者: Mango

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

在 C++ 中,std::remove 和 vector::erase 都用于删除容器中的元素。然而,它们之间有一些重要的区别。

std::remove

std::remove 属于算法(algorithm)组件的一部分,定义在 头文件中。该函数用于在容器中删除指定值并将所有其他值向前移动,然后返回新的逻辑结尾位置。它并不真正地删除容器中的元素,而是返回一个指向容器中新的逻辑结尾位置的迭代器。

template< class ForwardIt, class T >
ForwardIt remove( ForwardIt first, ForwardIt last, const T& value );

其中,first 和 last 表示元素范围,T& value 表示要删除的值。

例如:

std::vector<int> vec{ 1, 2, 3, 4, 5 };
auto new_end = std::remove(vec.begin(), vec.end(), 3); // 返回 new_end 指向 vec 中值为 3 的最后一个元素的下一个位置
vec.erase(new_end, vec.end()); // 删除 [new_end, vec.end()) 范围的所有元素,即删除 vec 中的 3
vector::erase

vector::erase 函数属于 vector 容器的一部分,定义在 头文件中。该函数用于删除容器中的元素,并将后续元素向前移动,直到填满其位置并销毁多余的元素,返回一个指向容器中下一个元素的迭代器。

iterator erase( const_iterator pos ); // 删除 pos 所指向的元素
iterator erase( const_iterator first, const_iterator last ); // 删除 [first, last) 范围内的所有元素

其中,pos 表示要删除的元素的迭代器,first 和 last 表示要删除的元素的范围。

例如:

std::vector<int> vec{ 1, 2, 3, 4, 5 };
vec.erase(std::remove(vec.begin(), vec.end(), 3), vec.end()); // 删除 vec 中所有值为 3 的元素
区别
  1. std::remove 仅删除特定值,而 vector::erase 可以删除任意元素。
  2. std::remove 并不真正地删除元素,而是将它们移动到容器的结尾。因此,必须使用 vector::erase 删除这些元素。
  3. 由于 std::remove 并不真正地删除元素,因此无法缩小容器的大小。相反,vector::erase 可以销毁多余的元素,缩小容器的大小。
  4. std::remove 不会改变容器的大小,而 vector::erase 会根据删除的元素的数量来改变容器的大小。

因此,在删除容器中的元素时,应该根据需要选择 std::remove 或 vector::erase 函数来达到最佳效果。