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

sal*_*oua 0 c++ struct stl vector

可能重复:
erase_if在哪里?

我的结构如下:

struct V {
 int x;
 int y;
}:
Run Code Online (Sandbox Code Playgroud)

我有一个结构元素的stl向量

vector<struct V> v1;
Run Code Online (Sandbox Code Playgroud)

我想从向量中删除属性y小于某个值的所有元素.

我怎么std::remove_if能通过定义与结构相关的谓词来做到这一点.

这是我定义的谓词,但似乎不正确.

struct less_than_value
{
 const int value;

 bool operator()(const struct V p) const
 {
    return p.y < value;
 }
};
Run Code Online (Sandbox Code Playgroud)

jua*_*nza 6

您可以将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() );
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,x将删除数据成员等于42的所有元素.

编辑:看你的例子,你需要做类似的事情

less_than_value pred = {5};
v1.erase( remove_if(v1.begin(), v1.end(), pred), v1.end() );
Run Code Online (Sandbox Code Playgroud)


Dav*_*eas 5

在 C++11 中,使用 lambda 就足够简单了:

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

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