我有一个类A
和一个 <
比较器。我如何使用它们对 A
的数组进行排序按降序顺序?
class A {
...
};
class LessA {
bool operator()(const A& a1, const A& a2) const {
...
}
}
vector<A> v;
sort(v.begin(), v.end(), ???);
我想我应该更换 ???
基于 LessA
的东西,但我无法弄清楚那里应该放什么。我想过使用 lambda 函数,但我一直在寻找更短的函数。
最佳答案
如果您想根据 LessA
定义的关系进行排序比较器,只需传递一个 LessA
的实例作为第三个参数(并且,由于您使用的是 C++11,因此更喜欢全局 std::begin()
和 std::end()
函数):
std::sort(std::begin(a), std::end(a), LessA());
// ^^^^^^^
现在,如果您的 LessA()
表示 <
关系,并且您想根据相反的标准进行排序,您可以这样做:
std::sort(std::begin(a), std::end(a),
[] (A const& a1, A const& a2))
{
return LessA()(a2, a1);
}
您可以做的另一件事是让您的自定义比较器接受一个参数,该参数决定了它应该如何执行比较:
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;
}
}
};
然后您可以使用这种方式按升序排序:
std::sort(std::begin(a), std::end(a), CompA(true));
这样降序排列:
std::sort(std::begin(a), std::end(a), CompA(false));
另一种可能性,鉴于您的原始 LessA
比较器,就是用std::bind
将参数的顺序交换为您的自定义比较器:
LessA comp;
using namespace std::placeholders;
std::sort(std::begin(v), std::end(v),
std::bind(&LessA::operator(), comp, _2, _1));
关于c++ - 定义 < 比较器时按降序对对象排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16550194/