从c ++向量中删除元素,其中删除条件依赖于其他元素

时间:2012-02-23 11:47:27

标签: c++ stl

在C ++中从向量中删除某些元素的标准方法是删除/擦除习惯用法。但是,传递给remove_if的谓词只将所考虑的向量元素作为参数。如果谓词是以数组的其他元素为条件的,那么有没有一种好的STL方法呢?

举一个具体的例子,考虑删除紧随其后的所有重复数字。这里,移除第n个元素的条件取决于第(n-1)个元素。

之前:11234555111333
之后:1234513

3 个答案:

答案 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。

来完成