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

您可以使用带有合适谓词的擦除删除习语:

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 中,使用 lambda 很简单:

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

在 C++03 中,它有点复杂,可以通过多种方式之一完成:创建与上面的 lambda 具有相同行为的函子;使用装订魔法(考虑boost::bind一种稍微简单的方法)。在这里使用装订魔法会非常复杂,所以我会避免它。

于 2012-10-26T14:07:29.903 回答
0

你会想要使用 remove_if (没有erase_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 回答