0

重複の可能性:
erase_if はどこにありますか?

私は次のような構造を持っています:

struct V {
 int x;
 int y;
}:

そして、構造体要素のstlベクトルがあります

vector<struct V> v1;

特定の値より小さい属性 y を持つすべての要素をベクトルから消去したいと思います。

std::remove_if構造に関連付けられた述語を定義することで、どうすればそれを行うことができますか。

それは私が定義した述語ですが、正しくないようです。

struct less_than_value
{
 const int value;

 bool operator()(const struct V p) const
 {
    return p.y < value;
 }
};
4

3 に答える 3

7

適切な述語でerase-remove イディオムを使用できます。

bool my_predicate(const V& item)
{
   // apply some logic and return true or false
   return item.x == 42;
}

#include <algorithm>

std::vector<V> v1 = ....;
v1.erase( remove_if(v1.begin(), v1.end(), my_predicate), v1.end() );

x上記の例では、データ メンバーが 42 に等しいすべての要素が削除されます。

編集:あなたの例を見ると、次のようなことをする必要があります

less_than_value pred = {5};
v1.erase( remove_if(v1.begin(), v1.end(), pred), v1.end() );
于 2012-10-26T14:02:48.213 に答える
5

ラムダで十分に単純なC++ 11では:

v1.erase( std::remove_if( v1.begin(), v1.end(), [](V const& v) { return v.y<value; }),
          v1.end());

C++03 ではもう少し複雑で、複数の方法のいずれかで実行できます。上記のラムダと同じ動作でファンクターを作成します。バインダリ マジックを使用します(boost::bindもう少し単純なアプローチを検討してください)。ここで結束魔法を使うとかなりややこしくなるので避けたい。

于 2012-10-26T14:07:29.903 に答える
0

remove_if を使用したいと思うでしょう (ererase_if はありません: コンテナが削除されたことを認識しない消去をどのように実装しますか?)

これを行う方法を示す (コンパイル済み、テスト済み) プログラムを次に示します。

#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

struct V
{
    int x; 
    int y;
};

bool y_less_than_5(V const &v)
{
    return v.y < 5;
}


int main()
{
    vector<V> vec;
    V v;
    v.x = 4;  v.y = 1; vec.push_back(v);
    v.x = 17; v.y = 3; vec.push_back(v);
    v.x = 21; v.y = 5; vec.push_back(v);
    v.x = 36; v.y = 7; vec.push_back(v);
    v.x = 25; v.y = 9; vec.push_back(v);

    vec.erase(
        remove_if(vec.begin(), vec.end(), y_less_than_5),
        vec.end());

    for(vector<V>::const_iterator it = vec.begin(); it != vec.end(); ++it)
    {
        cout << "[" << it->x << "," << it->y << "]" << endl;
    }
}

出力:

[21,5]
[36,7]
[25,9]

述語を提供する正確な方法は異なる場合がありますが、それは別の問題です;)

于 2012-10-26T14:04:49.530 に答える