根据对象的成员函数进行排序
Sort depending on member function of the object
我想根据元素的成员函数值对一些vector
进行排序,如下所示:
std::vector<cv::Rect> regions;
std::sort(begin(regions), end(regions), [](cv::Rect const& l, cv::Rect const& r){
return l.area() > r.area();
});
我可以在不直接编写比较的情况下做到这一点吗?我可以想象这样的事情:
std::sort(begin(regions), end(regions), std::compare_greater<cv::Rect::area>);//imaginary code
有这样的事情吗?
编辑: cv::Rect::area
是一个返回 float
的成员函数。 cv::Rect
没有比较运算符,或者它有一个,但我想根据另一个运算符进行排序。
继对OP的评论之后; 您可以将lambda重构为自己的函子以使用std::sort
,或者您可以通过组合std::greater
来使用C++03样式,std::mem_fun
与某种绑定(可能是std::bind
)等; 不过,C++03样式使用起来会很麻烦。
函子解要求调用运算符(operator()
)具有适当的签名;接受所需的值并返回bool
,const
方法和const&
参数是不需要的,但按照惯例通常会出现。
struct compare_rect_greater {
bool operator()(cv::Rect const& l, cv::Rect const& r) const
{
return l.area() > r.area();
}
};
// ...
std::vector<cv::Rect> regions;
std::sort(begin(regions), end(regions), compare_rect_greater());
area()
函数的float
返回将按预期与operator >
一起工作。
但是考虑到语言水平、易读性等,您的 lambda 仍然是更好的解决方案。
std::vector<cv::Rect> regions;
std::sort(begin(regions), end(regions), [](cv::Rect const& l, cv::Rect const& r){
return l.area() > r.area();
});
在这种情况下,C++03 样式的创建和使用起来很笨拙,我不会在这条路上冒险太远。
你可以为此创建一个类:
template <typename Member>
struct greater_member;
template <typename C, typename Method>
class greater_member<Method (C::*)>
{
explicit greater_member(Method (C::* method)) : mMethod(method) {}
bool operator()(const C& lhs, const C& rhs) const
{
return (lhs.*mMethod)() > (rhs.*mMethod)();
}
private:
Method (C::* mMethod);
}
template <typename C, typename Method>
greater_member<Method (C::*)> make_greater_member(Method (C::* method))
{
return greater_member<Method (C::*)>(method);
}
然后
std::sort(begin(regions), end(regions), make_greater_member(&cv::Rect::area));
演示
相关文章:
- 如何计算此排序函数的时间复杂度?
- 什么是自定义比较器以及如何在 C++ 的排序函数中使用它?
- 自定义排序函数中的堆溢出
- 分段 排序函数实现中的错误
- 使用排序函数 c++ 对字符数组进行排序
- 类中的排序函数
- 数组为此合并排序函数提供了正确的输出,但向量给出了不正确的输出.出了什么问题?
- 快速排序函数在快速排序算法中如何工作?
- 解释标准库排序函数C++的比较谓词的工作原理?
- C++ wrt 字符串中的 STL 排序函数
- 排序函数和优先级队列 C++ 中的比较器
- 为什么当我们使用等于'='符号比较器函数时,c ++的内置排序函数不起作用?
- C++排序函数中的奇怪之处
- C++ 排序函数中的数组项赋值
- 瓶颈 C++ 排序函数Wi-Fi 信号
- 算法中的排序函数返回错误
- 排序函数如何在整数对的向量上工作?
- 从递归向后选择排序函数调用 max 和交换函数
- 排序函数未正确返回数组
- 如何将比较器添加到自定义排序函数