c++ - 将附加参数传递给 remove_if

标签 c++ vector remove-if

我想使用 remove_if 函数从 vector 中删除元素,但将删除限制为 N 个元素。

例子:

// predicate function that determines if a value is an odd number.
bool IsOdd (int i) {

  if (we deleted more than deleteLimit)
    return false;

  return ((i%2)==1);
}


void otherFunc(){
  int deleteLimit = 10;

  // remove odd numbers:                       
  std::vector<int>::iterator newEnd =
  std::remove_if (myints.begin(), myints.end(), IsOdd (how to pass deleteLimit?) );
}

我需要 IsOdd 谓词存储它已删除的元素数量以及我们要删除的元素数量。 唯一的方法是使用全局变量?像这样:

int deleteLimit = 10;
int removedSoFar = 0;
bool IsOdd (int i) {

  if (deleteLimit < removedSoFar)
    return false;

  if (i%2==1) {
    removedSoFar++
    return true;
  }

  return false;

}
remove_if ...

最佳答案

告诉“到目前为止有多少元素被删除”的状态应该在函数/算法调用之外定义。这是因为仿函数不应具有在被调用时被修改的状态(这将是未定义的行为)。

您应该在仿函数的构造函数中引用此状态(计数器)(或在 lambda 中通过引用捕获),以便您可以访问和修改此计数器。当现在复制这个仿函数时,算法调用哪个仿函数并不重要,因为它们现在都持有对相同状态的引用。

使用仿函数 (C++03):

class IsOdd {
    int deleteLimit;
    int & deletedSoFar;

public:
    IsOdd(int deleteLimit, int & deletedSoFar) :
        deleteLimit(deleteLimit), deletedSoFar(deletedSoFar)
    {}

    bool operator()(int i) const {
        if (deletedSoFar < deleteLimit && i % 2) {
            ++deletedSoFar;
            return true;
        }
        return false;
    }
};

int deletedSoFar = 0;
int deleteLimit = 10;
std::remove_if (myints.begin(), myints.end(), IsOdd(deleteLimit, deletedSoFar));

使用 lambda (C++11):

int deletedSoFar = 0;
int deleteLimit = 10;
auto it = std::remove_if (myints.begin(), myints.end(), [deleteLimit,&deletedSoFar](int i){
    if (deletedSoFar < deleteLimit && i % 2) {
        ++deletedSoFar;
        return true;
    }
    return false;
});
myints.erase(it, myints.end());

关于c++ - 将附加参数传递给 remove_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16915679/

相关文章:

matlab - 如何在 Matlab 中从数据集中删除数据点

python - 如何使用另一个列表作为引用从列表中的项目中删除字符

c++ - 如何使用 STL 从容器集中删除自定义对象?

c++ - 是否可以将异常传递给处理程序然后重新抛出原始异常?

c++ - 使用 PyTorch、HElib 和 OpenCV 编译 C++ 程序时出现问题

java - 如何从 Java 应用程序 (AWT) 中的外部控件获取文本(或自动化)?

c++ - C++-错误: class has not been declared/out of scope

c++ - 为 vector 成员提供默认值并更新元素

math - 给定起点,每个旋转轴的角度和方向,计算终点

c++ - 如何将 remove_if 与删除一起使用