根据属性值擦除struct的向量中的元素

时间:2012-10-26 13:55:44

标签: c++ stl vector struct

  

可能重复:
  Where is 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;
 }
};

3 个答案:

答案 0 :(得分:6)

您可以将erase-remove idiom与合适的谓词一起使用:

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() );

答案 1 :(得分:4)

在C ++ 11中,使用lambda非常简单:

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

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

答案 2 :(得分: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]

您提供谓词的确切方法可能有所不同,但这是一个不同的问题;)