2009-11-30 91 views
2

在这本书中“C++简单地说”,就有了下面的示例代码帮助我理解的std ::擦除

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

我认为,“删除”是一个成员函数,这样难道不应该是'data.erase'而不是'std :: erase'? 有没有某种方式的C++编译器可以告诉你想要什么成员调用成员函数,或没有书本省略擦除模板函数的任何文档,或者是错误的例子?

回答

13

erase是一个成员函数。提供的示例不正确。

0

编辑:对不起他们是没有通用擦除,只是双重检查

+0

有没有通用的算法'erase'。 – 2009-11-30 19:10:13

+0

...甚至不在''中(请继续尝试)。 – 2009-11-30 19:11:04

+0

是的,我错误地说有一个通用的擦除算法(我记得错了)。但标准库中有一个算法头。其中包括许多通用算法(查找,包含等),它与各种stl容器一起工作。 – lkristjansen 2009-11-30 19:15:06

7

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

this question关于幻影std :: erase。

+0

具体而言,所有的序列和关联容器都提供成员'erase()'(它是它们的要求的一部分)以及'std :: basic_string'。 – 2009-11-30 19:13:16

3

是的,擦除是一个成员函数,所以它应该是data.erase()而不是std::erase()

3

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

0

有一个叫做std :: remove的算法。并在数据结构上调用擦除。 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) ; 
} 
+0

再次阅读问题。它使用std :: remove。你不必说“看起来他们想要什么”,因为这就是他们用的。 – 2009-12-01 12:59:52