我有一个对象的std::vector
,我重载了<
运算符。
如何使用std::sort
将其按降序排序(而无需编写自己的比较器)?
您可以使用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; });
std::greater<T>
。 - Barrystd::greater
不同于 not2(std::less)
,但我相信它们在排序时会得到相同的结果。 - SirGuystd::greater
使用的是operator>
而不是operator<
。已经发布了一个使用该函数的答案,但已被删除。至于使用not_fn
进行取反,这会得到!(a < b)
,在逻辑上(当所有关系运算符都被合理重载)等同于a >= b
,而你需要的是a > b
。 - user743382std::bind(std::less<T>(), std::placeholders::_2, std::placeholders::_1)
。使用lambda表达式违反了原帖中不创建自定义比较器的要求,但std::bind
则没有。然而,看到这个混乱的代码,我希望原帖作者改变想法,还是采用lambda表达式更好。 :) - user743382[1, 1]
进行排序,两个比较都会产生 true
。 - Kerrek SBstd::sort(v.rbegin(), v.rend());
std::sort
对数组进行排序,然后再使用 std::reverse
进行反转。这样可以按照你想要的方式进行排序。std::sort(v.begin(), v.end());
std::reverse(v.begin(), v.end());
std::sort(begin(v), end(v), std::greater<>);
- SirGuystd::sort(v.rbegin(), v.rend());
- Piotr Skotnickivoid
作为模板参数传递来实现的。同时,标准将void
设为默认模板参数(如果未指定)。语法std::greater<>
使用默认参数实例化对象。 - SirGuystd::greater<>()
。 - Piotr Skotnicki