如何按降序排序在c ++中工作?

时间:2018-04-30 16:40:07

标签: c++ sorting

我正在搜索如何按降序对矢量进行排序,然后我找到了这段代码

std::sort(numbers.begin(), numbers.end(), std::greater<int>());

它有效,但我只是想知道它是如何工作的

3 个答案:

答案 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::sorthere以及其他地方)的文档说明了

之类的内容
  

按升序对[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

相关问题