在“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 ++编译器告诉你想要成员函数的成员,或者本书是否省略了擦除模板函数的任何文档,或者示例是错误的?
答案 0 :(得分:13)
erase
是会员功能。提供的样本不正确。
答案 1 :(得分:7)
没有std::erase
。 std::map::erase
,std::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 ) ;
}