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());
}
a が int で bool 値が必要なため、void delete は機能しないと推測していますが、remove_if の 3 番目のパラメーターとして「int a がこのベクトルにある場合は true を返す」を表現する方法がわかりません。そして、 void delete_even が機能することを期待しますが、取得します
note: in instantiation of function template specialization 'std::__1::remove_if<std::__1::__wrap_iter<int *>, bool>' requested here