我有一个对象向量。我的数据结构如下:
class my_class{
float a; int b;
};
my_class obj;
vector<my_class> vec;
Run Code Online (Sandbox Code Playgroud)
向量 vec 包含以下形式的数据:
vec
((10.0,2),(100,3),(19.0,3)...)
Run Code Online (Sandbox Code Playgroud)
现在,我打算从向量 vec 中删除小于或等于 vec 最后一个元素的元素...为此,我使用擦除和remove_if函数:
vec.erase(std::remove_if(vec.begin(), vec.end(), predicate_function(vec, (vec.end()-1).a, (vec.end()-1).b)), vec.end());
Run Code Online (Sandbox Code Playgroud)
我拥有的 predicate_function 对“vec”进行迭代。然而,这违背了使用 std::remove_if 的目的。有人可以帮助了解 predicate_function 应该是什么样子才能使remove_if 起作用吗?我不想使用 lambda_function。另外我的编译器是GCC
谓词函数将自动传递来自每个迭代器的参数。所以它看起来像这样:
bool predicate_function(const my_class& m)
{
//Some logic here
}
Run Code Online (Sandbox Code Playgroud)
那么这将被简单地称为:
vec.erase(std::remove_if(vec.begin(), vec.end(), predicate_function), vec.end());
Run Code Online (Sandbox Code Playgroud)
在 C++ 术语中,std::remove_if期望 aUnaryPredicate作为其第三个参数,它是接受 1 个参数并返回 的函数或函子bool。
编辑:要在评论中执行您想要的操作,您需要使用functor(或std::bind,但我们将在此处使用函子路线):
struct compare_last
{
const my_class last_;
compare_last(const my_class& last)
: last_(last)
{ }
bool operator()(const my_class& m) const
{
return m == last_; //Or however you do your comparisons
}
};
my_class& last = *(--vec.end());
vec.erase(std::remove_if(vec.begin(), vec.end(), compare_last(last)), vec.end());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5748 次 |
| 最近记录: |