定义<比较器时,按降序对对象排序?

Pau*_*scu 7 c++ sorting comparator c++11

我有一个班级A和一个<比较器.我怎样才能用它们来排序的数组A中的降序顺序?

class A {
...
};

class LessA {
   bool operator()(const A& a1, const A& a2) const {
   ...
   }
}

vector<A> v;
sort(v.begin(), v.end(), ???);
Run Code Online (Sandbox Code Playgroud)

我想我应该用???基于的东西替换LessA,但我无法弄清楚应该在那里进行什么.我想过使用lambda函数,但我一直在寻找更短的东西.

And*_*owl 7

如果要根据LessA比较器定义的关系进行排序,只需传递一个实例LessA作为第三个参数(并且,因为您使用的是C++ 11,所以更喜欢全局std::begin()std::end()函数):

std::sort(std::begin(a), std::end(a), LessA());
//                                    ^^^^^^^
Run Code Online (Sandbox Code Playgroud)

现在,如果你LessA()表达了这种<关系,并且你想根据相反的标准进行排序,你可以这样做:

std::sort(std::begin(a), std::end(a), 
    [] (A const& a1, A const& a2))
{
    return LessA()(a2, a1);
}
Run Code Online (Sandbox Code Playgroud)

您可以做的另一件事是让您的自定义比较器接受一个参数来确定它应该如何执行比较:

class CompA {
    bool lessThan;
public:
    CompA(bool lessThan) : _lessThan(lessThan) { }
    bool operator()(const A& a1, const A& a2) const {
        if (_lessThan)
        {
            // return true iff a1 < a2;
        }
        else
        {
            // return true iff a1 > a2;
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用这种方式按升序排序:

std::sort(std::begin(a), std::end(a), CompA(true));
Run Code Online (Sandbox Code Playgroud)

这种方式按降序排序:

std::sort(std::begin(a), std::end(a), CompA(false));
Run Code Online (Sandbox Code Playgroud)

给定原始LessA比较器的另一种可能性是用于std::bind将参数的顺序交换到自定义比较器:

LessA comp;
using namespace std::placeholders;
std::sort(std::begin(v), std::end(v), 
    std::bind(&LessA::operator(), comp, _2, _1));
Run Code Online (Sandbox Code Playgroud)


Pet*_*ood 6

向后排序范围:

vector<A> v;
sort(v.rbegin(), v.rend(), LessA());
Run Code Online (Sandbox Code Playgroud)

rbegin,并rend给你反向迭代器.

封装,如果它太混乱:

void reverse_sort(vector<A>& v) {
    sort(v.rbegin(), v.rend(), LessA());    
}
Run Code Online (Sandbox Code Playgroud)

用法:

vector<A> v;
reverse_sort(v);
Run Code Online (Sandbox Code Playgroud)