0

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
4

2 に答える 2

1

自分で検索せずに、コレクションから値std::removeを削除するために使用します。int

vec.erase(std::remove(vec.begin(), vec.end(), 2), vec.end());

これにより、すべての2fromが削除されvecます。

の使用法remove_ifは同じですが、述語 (通常は関数) を指定する要素ではなく、その場合のみです。C++11 を使用できる場合は、ラムダで使用できます。

vec.erase(std::remove_if(vec.begin(), vec.end(), [](int a) {return a % 2 == 0;}), vec.end());

is_evenへの述語 (またはクラスの別のメンバー関数) として使用する場合remove_ifは、コメントに記載されているように、できれば静的メンバー関数にする必要があります。bind非静的メンバーにもできますが、ここでそれを行う本当の理由はありません。ただし、メンバー関数で std::bind を使用する、この引数にオブジェクト ポインターを使用するかどうかを参照してください。興味がある場合は、質問自体に正しい構文が含まれています。is_evenas staticのサンプル:

 static bool is_even(int value) {
     return value % 2 == 0;
 }

 void delete_even(int a){
     vec.erase(remove_if(vec.begin(), vec.end(), is_even), vec.end());
 }
于 2015-11-06T16:51:00.857 に答える