我知道这是一件小事,但我希望能够准确理解std::sort()
。
给出功能模板
template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
可以阅读以下here(我的重点):
comp - 比较函数对象(即满足...的对象) Compare的要求,如果第一个参数是,则返回true 少比第二个。
但是在下面的示例中,可以看到std::greater<int>()
和lambda-expression [](int a, int b) { return b < a; }
都不满足Compare函数对象的此要求。
答案 0 :(得分:4)
如果您同时阅读(取自same doc ),那是正确的:
按升序对[first,last]范围内的元素进行排序。
也就是说,要按递增顺序对范围进行排序,如果第一个参数小于秒,则 cmp 必须返回true
,否则范围将按递减顺序排序。使用std::greater<int>
和lambda的示例都用于按递减顺序对范围进行排序!
答案 1 :(得分:4)
首次阅读时有点令人困惑,但如果您看一下Type requirements
部分,则会说:
比较必须符合比较的要求。
指向C++ concepts: Compare,表示(强调我的):
应用于Compare类型对象的函数调用操作的返回值,当上下文转换为bool时,如果调用的第一个参数出现在由此引起的严格弱排序关系中的第二个参数之前,则返回true比较类型,否则为false。
继续建立comp(a, b)
的要求,即它与以下属性建立严格的弱排序关系:
答案 2 :(得分:3)
根据排序比较器的定义,它应该根据从较小到较大的对象排序较少,即升序。
std :: sort和比较器之间的接口定义为“比较两个对象并告诉我哪一个出现在输出中”。 Less 正是std :: sort docs定义为“在输出中的早期”,不小于。
对于greater
,“比较大于”将出现在输出的前面,因此它告诉分拣机这些是“较少”的值,以便排序算法根据我们的内容正确告诉他们。
所有这些都是关于分离算法(按照某种顺序排序)和实际比较。这两个需要一个接口。
如果按照Rhubarb Pies(我最喜欢的“抽象”对象)来考虑,可以比较它们的半径(如果Pie A的半径小于Pie B,则需要返回true)。我们可能还想从最美味到最健康的排序,如果馅饼A的卡路里比馅饼B更多,则返回true。
较少表示按升序排列在下方/之前。
(对std :: sort进行第四次arg bool reversed
是不必要的,因为我们可以提供一个带有反向运算符/比较的lambda。)
答案 3 :(得分:2)
小于某事与你想要的相关。真正需要的是实际上严格的订购。