帮我理解std :: erase

时间:2009-11-30 18:58:03

标签: c++ stl

在“C ++ In A Nutshell”一书中,有以下示例代码

std::vector<int> data
...
std::erase(std::remove(data.begin(), data.end(), 42),
  data.end());

我认为'erase'是一个成员函数,所以不应该是'data.erase'而不是'std :: erase'? 有没有什么方法可以让c ++编译器告诉你想要成员函数的成员,或者本书是否省略了擦除模板函数的任何文档,或者示例是错误的?

6 个答案:

答案 0 :(得分:13)

erase是会员功能。提供的样本不正确。

答案 1 :(得分:7)

没有std::erasestd::map::erasestd::list::erase存在。但是不存在std::erase

看看this question关于幻影std :: erase。

答案 2 :(得分:3)

是的,erase是一个成员函数,因此它应该是data.erase()而不是std::erase()

答案 3 :(得分:3)

你的观察是正确的。 '擦除'应该是成员函数。只有容器上的成员函数才能更改该容器的内存大小。

答案 4 :(得分:0)

编辑:抱歉他们不是一般擦除,只是双重检查

答案 5 :(得分:0)

有一种名为std :: remove的算法。并在数据结构上调用erase。 remove将要擦除的所有元素移动到迭代器范围的末尾,并返回要删除的第一个元素。如果找不到元素,则返回end()。

那么你从std :: remove的返回值和数据结构的结尾开始调用erase。

请参阅:http://www.sgi.com/tech/stl/remove.html

请注意,删除不适用于有序数据结构,因为无法重新排列元素。

删除是线性的,因此将向上移除一个向量。因为它不需要在要删除的元素之后冒泡元素。

std::vector<int> data
...
data.erase(std::remove(data.begin(), data.end(), 42), data.end())

比较类似于O(N ** 2)

的东西
std::vector<int> data
...
for ( i = data.begin(), i != data.end(); ++i ) {
  if ( *i == 42 ) data.erase( i ) ;
}