【发布时间】:2023-03-21 02:17:01
【问题描述】:
在使用 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
【问题讨论】:
-
void delete(int a)疯了 -
你为什么要抹掉
remove_if的返回?? -
@YSC 因为这就是它与迭代器和
remove一起工作的方式。令人困惑,但确实如此。 -
@MicroVirus 没错,我的错。周末在这里;)
标签: c++ vector erase-remove-idiom