gpt4 book ai didi

c++ - 根据对象的成员函数排序

转载 作者:行者123 更新时间:2023-11-30 00:47:11 31 4
gpt4 key购买 nike

我想根据元素的成员函数值对一些 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 与某种绑定(bind)(可能是 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 风格很难创建和使用,我不会在这条路上冒险走得太远。

关于c++ - 根据对象的成员函数排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35547736/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com