使用运算符重载对std::sort进行降序排序

3

我有一个对象的std::vector,我重载了<运算符。

如何使用std::sort将其按降序排序(而无需编写自己的比较器)?


1
std::sort(begin(v), end(v), std::greater<>); - SirGuy
3
std::sort(v.rbegin(), v.rend()); - Piotr Skotnicki
可能是将向量按降序排序的重复问题。 - SirGuy
2
从C++14开始,比较函数有一个特殊化,这是通过将void作为模板参数传递来实现的。同时,标准将void设为默认模板参数(如果未指定)。语法std::greater<>使用默认参数实例化对象。 - SirGuy
1
@GuyGreer 但是那个对象仍然需要被实例化,即 std::greater<>() - Piotr Skotnicki
显示剩余2条评论
3个回答

7

您可以使用std::bind将参数转化为std::less的形式:

using namespace std::placeholders;
std::sort(v.begin(), v.end(), std::bind(std::less<T>{}, _2, _1));

但我认为,即使违反不编写自己的比较器的约束条件,也只需编写相应的短lambda表达式,这样会更加简洁:

std::sort(v.begin(), v.end(), [](T const& lhs, T const& rhs) { return rhs < lhs; });

@GuyGreer 不是 std::greater<T> - Barry
1
虽然 std::greater 不同于 not2(std::less),但我相信它们在排序时会得到相同的结果。 - SirGuy
2
@GuyGreer std::greater使用的是operator>而不是operator<。已经发布了一个使用该函数的答案,但已被删除。至于使用not_fn进行取反,这会得到!(a < b),在逻辑上(当所有关系运算符都被合理重载)等同于a >= b,而你需要的是a > b - user743382
3
巴里,做得好,我认为确实存在这种方式,尽管不以这个名称命名:std::bind(std::less<T>(), std::placeholders::_2, std::placeholders::_1)。使用lambda表达式违反了原帖中不创建自定义比较器的要求,但std::bind则没有。然而,看到这个混乱的代码,我希望原帖作者改变想法,还是采用lambda表达式更好。 :) - user743382
2
这似乎是未定义行为:如果你对 [1, 1] 进行排序,两个比较都会产生 true - Kerrek SB
显示剩余7条评论

3
std::sort(v.rbegin(), v.rend());

0
你可以使用 std::sort 对数组进行排序,然后再使用 std::reverse 进行反转。这样可以按照你想要的方式进行排序。
std::sort(v.begin(), v.end());
std::reverse(v.begin(), v.end());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接