这是文档中的一个小错误还是我错过了一些错误
Is this a minor error in the documentation or am I missing something?
我知道这是一件小事,但我想确切地了解我对std::sort()
的理解。
给定功能模板
template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
一个人可以在此处阅读以下内容(我的重点):
comp-比较功能对象(即满足的对象 比较要求)如果第一个参数是 比第二个
但是在下面的示例中,人们可以看到std::greater<int>()
和lambda-expression [](int a, int b) { return b < a; }
都不满足比较函数对象的要求。
首先阅读有些混乱,但是如果您查看a Type requirements
节,则说:
比较必须满足比较的要求。
指向C 概念:比较说(强调矿山):
应用于类型对象的函数调用操作的返回值,如果上下文转换为bool,则如果呼叫的第一个参数出现在第二个严格的弱排序关系之前,则会产生true。比较类型,否则为false。
并继续建立comp(a, b)
的要求,即它与以下属性建立了严格的弱排序关系:
- 对于所有a,comp(a,a)== false
- 如果comp(a,b)== true,则comp(b,a)== false
- 如果comp(a,b)== true和comp(b,c)== true then comp(a,c)== true
,如果您与此一起阅读(摘自同一doc )是正确的:
在上升顺序中对范围内的元素进行分类。
也就是说,要以增加顺序对范围进行排序,如果第一个参数小于秒,则必须返回 true
,否则该范围将以减小的顺序排序。使用std::greater<int>
和LAMBDA的示例都用于按顺序排列范围!
应该根据将对象从较小到更大的分类,即上升顺序来比较>排序比较器。
std :: sort和比较器之间的接口被定义为"比较两个对象,并告诉我一个出现在输出中的哪个对象"。少就是std :: sort docs定义为"输出中的较早",不小于。
对于 greater
,"比较 - 比"要较早出现在输出中,因此它告诉混乱器这些是"较少"的值,因此分类算法根据我们告诉他们的内容正确。/p>
这全都是要分开算法(根据某些顺序进行排序)和实际比较。这两个需要一个接口。
如果您用大黄馅饼(我最喜欢的"抽象"对象)思考,则可以比较它们的半径(如果pie a的半径小于pie b,则需要返回true)。我们可能还想从最美味到最健康的地方排序,因此,如果馅饼的卡路里比Pie B多。
,则恢复了真实。少于表示以下/更早按升序排序。
(将第四个arg bool reversed
to std ::排序是不必要的,因为我们可以为lambda提供反转操作员/比较。)
少于相对于您想要的东西。真正需要的是严格的订购。
- 不断收到相同的错误...怎么了?C++
- gcc 是否在 2 条短裤的过度对齐结构的比较中错过了优化机会?
- 我的C++合并排序代码不起作用。我在这里错过了什么?
- 我是否为邪恶刽子手的构造函数错过了什么?
- C++:将向量传递给函数,然后在main中调用函数.错过了什么
- 随机访问迭代器:我错过了什么?
- 当编译时已知引用占用结构中的空间时,是否错过了优化?
- std::元组大小,是不是错过了优化?
- 在这个while循环中我错过了什么?
- 编译器错过了无效的构造函数调用,并调用不存在的(或私有的)默认构造函数
- 我是否错过了什么,或者虚拟呼叫的性能并不像人们所说的那样糟糕
- C 中MAP的反向迭代错过了第一个元素
- 我在变量上收到 3 个 C4703 错误,我认为我已经正确初始化了,但我不确定我错过了什么
- 如果这不是 boost::lockfree::d etail::freelist 中的错误,我在这里错过了什么
- 尝试使用类,但未打印任何内容.不会生成任何错误.我错过了什么吗?
- 这是文档中的一个小错误还是我错过了一些错误
- {错误 C2338: (boost::has_trivial_destructor:<T>:value)} 对于 boost::lockfree::queue 是什么意思?我在这里错过了什
- 我错过了什么?c++错误
- C++错误C2447?我错过了什么
- Cocos2D-X链接器错误;我错过了什么