在使用 remove_if 之前,我使用的是 remove。所以说如果我有 vec = {1, 2, 2, 2, 5},并且想要删除所有 2,我会这样做:
for (vector<int>::iterator it = vec.begin(); it!= vector.end(); ++it){
if (*it == 2){
vec.erase(remove(vec.begin(),vec.end(), *it), vec.end());
}
}
这是行不通的,因为在删除过程中遍历向量是不可能且不合逻辑的。
于是我发现了remove_if()。但是,由于某种原因,我无法让它在类的上下文中工作。这是我的代码:
class SomeClass{
private:
vector<int> vec;
public:
SomeClass(){
//initalizae vec to {1,2,2,2,4,5,6,8}
}
bool is_even(int value){
return value % 2 == 0;
}
void delete(int a){
vec.erase(remove_if(vec.begin(), vec.end(), a), vec.end());
}
void delete_even(int a){
vec.erase(remove_if(vec.begin(), vec.end(), this->is_even(a)), vec.end());
}
我猜 void delete 将不起作用,因为 a 是一个 int 并且我需要一个 bool 值,但不确定如何将“如果 int a 在此向量中返回 true”表示为 remove_if 的第三个参数。我希望 void delete_even 可以工作,但我得到了
note: in instantiation of function template specialization 'std::__1::remove_if<std::__1::__wrap_iter<int *>, bool>' requested here