c++ - 定义 < 比较器时按降序对对象排序?

标签 c++ sorting c++11 comparator

我有一个类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/

相关文章:

c++ - 构建错误 : "cannot find target for file" and "undefined reference"

c++ - C/C++ : 2-D array variable subscript

c++ - 我怎么会 'generate variadic parameters'?

c++ - C++11赋值运算符副作用的求值顺序

c++ - 为什么在使用 try_lock() 时需要显式比较?

c++ - 检查转换对象的原始类型

c++ - 为什么在资源管理器窗口关闭时会启动几个 GetClipboardData?

python - 在 Numpy 数组中查找 'greatest value less than' 索引的最佳方法

Javascript 排序多维对象

java - 合并排序中的递归 : two recursive calls