可能重复:
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;
}
};
答案 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]
您提供谓词的确切方法可能有所不同,但这是一个不同的问题;)