为什么std::includes算法使用小于运算符而非等于运算符作为判断条件
问题解答
你的推导逻辑是正确的,在第一个条件的过滤下,代码运行到第二个if判断时,已经保证了*first2 >= *first1,因此!(*first1 < *first2)等效于*first1 >= *first2,两者结合确实只有两个元素等价时才会触发first2自增。标准库实现选择用<而非==的核心原因不是可读性,而是泛用性设计:
- 标准库有序算法的约束要求更低:
std::includes的前置要求是两个输入范围都以同一个比较规则(默认是<运算符对应的严格弱序)排好序,仅要求元素支持小于比较即可使用,不需要额外实现==运算符。如果改用==判断,会强制要求使用该算法的类型必须实现==,大幅缩小算法的适用范围,违背了标准库泛型算法的设计原则。 - 严格遵循排序规则的等价判定:标准库有序算法中,两个元素的等价性判定统一遵循排序用的比较规则,即
a和b等价当且仅当!(a < b) && !(b < a),不需要依赖==运算符的实现。哪怕自定义类型的==运算符逻辑和排序用的<逻辑不匹配,只要<符合严格弱序要求,标准库的实现就可以正确运行;而使用==的自定义实现会出现逻辑错误。
你的实现对于内置数值类型(如int)可以正常工作,但泛用性远低于标准库实现,无法适配仅实现了<运算符的自定义类型。
内容的提问来源于stack exchange,提问作者Itachi Uchiwa
相关产品推荐
相关产品推荐

