我正在搜索如何按降序对矢量进行排序,然后我找到了这段代码
std::sort(numbers.begin(), numbers.end(), std::greater<int>());
它有效,但我只是想知道它是如何工作的
答案 0 :(得分:2)
std::sort
函数希望你†给它一个函数来告诉它如何按升序对一个范围进行排序,所以默认它会使用像{{1}这样的东西}。
通过提供具有相反效果的函数(即std::less<int>()
),您正在将这种期望从字面上转向其头部,从而产生默认行为的完全合法的“镜像”。也就是说,反向排序。
解释它的另一种方式是,在其算法的每一步,当它想知道一个元素 A 是否应该“先于”另一个元素 B 时,它会询问std::greater<int>()
,它将告诉它:是的,一个元素 A 应该“在”另一个元素 B 之前“std::greater<int>()
,并且你去吧。
A > B
这与使用 5 3 2 1
> > >
之类的默认行为相反:
<
† 当然,你实际上可以给它一个定义你喜欢的任何其他顺序的功能(受某些限制),所以还有更多的选择。在这里,我只探讨两种最明显的排序方法。
答案 1 :(得分:2)
std::sort
的第三个参数是一个函子/函数,如果要将第一个参数放在排序顺序中的第二个元素之前,则返回true
。
std::greater<int>::operator()(...)
将返回true
。
因此,使用std::greater<int>()
作为std::sort
的第三个参数会导致对象集合按降序排序。
答案 2 :(得分:1)
std::sort
(here以及其他地方)的文档说明了
按升序对[first,last]范围内的元素进行排序。
这是一种方便的简化,但当你想要升序时,它会让人感到困惑。
认为sort
根据一些函数重新排列你的范围更有用 - 我们称之为pre
- 它表示任何一对元素,哪一个应该在另一个元素之前(之前)。
也就是说,该函数看起来像
bool pre(int a, int b); // return true if a should precede b
默认行为,如果您未指定其他内容,则使用std::less
,这将大致如下:
bool less(int a, int b) { return a<b; }
和此默认值(其中较小的值始终位于较大的值之前)为您提供按升序排序的结果。
如果您指定std::greater
,则表示较大值应始终位于较小之前(因为如果greater(a,b)==true
,则表示两者都是a>b
以及a
将在输出中位于b
之前。
因此,这与说结果按降序排序相同。
NB。我调用了比较pre
,因为它告诉您哪些元素应该在哪个元素之前,还因为它是predicate(特别是BinaryPredicate,更具体地说是Comparison)