【问题标题】:Remove elements from a c++ vector where the removal condition is dependent on other elements从删除条件取决于其他元素的 C++ 向量中删除元素
【发布时间】:2012-03-13 19:43:41
【问题描述】:

在 C++ 中从向量中删除某些元素的标准方法是删除/擦除习语。但是,传递给remove_if 的谓词仅将考虑中的向量元素作为参数。如果谓词以数组的其他元素为条件,是否有一种好的 STL 方法可以做到这一点?

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

之前:11234555111333
之后:1234513

【问题讨论】:

  • 您的示例是 STL 中 unique 算法的示例。请查看完整的 STL 算法列表,您可能会找到您需要的答案。

标签: c++ stl


【解决方案1】:

对于您的具体示例,其他人已经提到了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】:

    在我看来,使用简单的遍历算法(通过 for)而不是使用 std::bind 会更容易。当然,使用 std::bind 您可以使用其他函数和谓词(这取决于先前的元素)。但在您的示例中,您可以通过简单的 std::unique 来实现。

    【讨论】:

      【解决方案3】:

      对此有一个标准算法。 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
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-22
        • 1970-01-01
        相关资源
        最近更新 更多