我想使用 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/