在C ++中从向量中删除某些元素的标准方法是删除/擦除习惯用法。但是,传递给remove_if
的谓词只将所考虑的向量元素作为参数。如果谓词是以数组的其他元素为条件的,那么有没有一种好的STL方法呢?
举一个具体的例子,考虑删除紧随其后的所有重复数字。这里,移除第n个元素的条件取决于第(n-1)个元素。
之前:11234555111333
之后:1234513
答案 0 :(得分:2)
有一个标准的算法。 std::unique
将删除与它们之前的元素重复的元素(实际上,就像remove_if
它重新组织容器一样,以便在其末尾收集要删除的元素。)
为简单起见std::string
上的示例:
#include <string>
#include <iostream>
#include <algorithm>
int main()
{
std::string str = "11234555111333";
str.erase(std::unique(str.begin(), str.end()), str.end());
std::cout << str; // 1234513
}
答案 1 :(得分:2)
其他人已经提到了std::unique
,具体的例子。 Boost.Range具有adjacent_filtered
adaptor,它将范围中的当前和下一个元素传递给谓词,并且由于谓词,适用于更大范围的问题。但是,Boost.Range也有uniqued
adaptor。
另一种可能性就是简单地保留对范围的引用,这在C ++ 11中很容易用lambda:
std::vector<T> v;
v.erase(std::remove_if(v.begin(), v.end(),
[&](T const& x){
// use v, with std::find for example
}), v.end());
答案 2 :(得分:0)
在我看来,将更容易使用简单的遍历算法(via for),而不是使用std :: bind。当然,使用std :: bind,您可以使用其他函数和谓词(这取决于之前的元素)。但在您的示例中,您可以通过简单的std :: unique。
来完成