4

オブジェクトのベクトルがあります。私のデータ構造は次のとおりです。

 class my_class{
       float a; int b;
 };
 my_class obj;
 vector<my_class> vec;

ベクトル vec には、次の形式のデータが含まれます。

 vec
 ((10.0,2),(100,3),(19.0,3)...)

ここで、ベクトル vec から、vec の最後の要素以下の要素を削除するつもりです...このために、erase および remove_if 関数を使用しています。

vec.erase(std::remove_if(vec.begin(), vec.end(), predicate_function(vec, (vec.end()-1).a, (vec.end()-1).b)), vec.end());

私が持っている predicate_function は、「vec」を反復処理します。ただし、これは std::remove_if を使用する目的に反します。remove_if が機能するために predicate_function がどのように見えるべきかについて誰か助けてください。lambda_function を使用したくありません。また、私のコンパイラはGCCです

4

1 に答える 1

5

述語関数には、各 Iterator からパラメーターが自動的に渡されます。したがって、次のようになります。

bool predicate_function(const my_class& m)
{
    //Some logic here
}

これは単に次のように呼び出されます。

vec.erase(std::remove_if(vec.begin(), vec.end(), predicate_function), vec.end());

C++ の用語でstd::remove_ifは、UnaryPredicate3 番目のパラメーターとして a が必要です。これは、1 つの引数を受け入れて を返す関数またはファンクターboolです。

編集: コメントで必要なことを行うには、functor(またはを使用する必要がありstd::bindますが、ここではファンクター ルートを使用します):

struct compare_last
{
    const my_class last_;

    compare_last(const my_class& last)
      : last_(last)
    { }

    bool operator()(const my_class& m) const
    {
        return m == last_; //Or however you do your comparisons
    }
};

my_class& last = *(--vec.end());
vec.erase(std::remove_if(vec.begin(), vec.end(), compare_last(last)), vec.end());
于 2013-04-11T02:36:27.510 に答える