C++ STL算法中Lambda函数内部逻辑编写相关疑问咨询
C++ Lambda 与 STL 算法比较器问题解答
关于sort比较器的三个问题
1. 为什么Lambda只需要2个参数
STL 中的所有排序算法的核心逻辑都是基于两两元素比较实现的,不管底层是快速排序、归并排序还是其他实现,本质都只需要知道「两个元素相比,谁应该排在前面」的规则即可,不需要一次性拿到所有元素做处理。
这种设计是STL算法的通用思路:把通用的排序执行逻辑和业务自定义的比较规则解耦,你只需要提供判断两两优先级的规则,排序的遍历、交换、分组等底层操作算法内部已经封装好了,不需要开发者实现。
2. 为什么返回a > b是降序,b > a不行
不存在Lambda的默认规则,这是STL所有比较器统一遵守的约定:对于比较器comp(a, b),返回true表示a应该排在b的前面。
- 默认排序用的是
less<int>(),也就是返回a < b,意思是「a比b小的时候,a放前面」,最终结果就是升序。 - 你要降序,就是要「a比b大的时候,a放前面」,所以返回
a > b即可。 - 如果返回
b > a,等价于判断「b比a大的时候,a放前面」,也就是小的元素放前面,最终结果还是升序,自然达不到降序的效果。
3. 为什么只需要返回布尔值
排序的两两比较逻辑只需要两种判断结果:a排在b前面,或者a不需要排在b前面。布尔值刚好可以覆盖这两种场景,足够支撑所有排序的规则判断,不需要额外设计字符枚举等返回值,这种设计更简洁也避免了无效值的处理开销。
关于max_element比较器的问题
首先明确max_element的比较器约定和sort完全一致:comp(a, b)返回true表示a的优先级低于b,也就是b比a更符合「最大值」的要求。
默认的max_element用的是less<int>(),也就是a < b时返回true,意思是「a比b小,所以b更适合当最大值」,最终就能选出最大元素,所以你写的两个都是偶数时返回a < b的逻辑是对的,刚好符合默认选最大值的规则。
但是你当前的代码存在逻辑缺陷:else return false的逻辑会导致奇数的优先级高于偶数。比如当a是奇数、b是偶数时,会进入else分支返回false,也就是认为a的优先级不低于b,最终会优先选择奇数,不符合你要选「最大偶数」的要求。
正确的比较器逻辑应该调整为:
itr = max_element(v1.begin(), v1.end(), [](const int &a, const int &b){ bool aEven = isEven(a), bEven = isEven(b); // 只有b是偶数a不是的话,b优先级更高,返回true if (!aEven && bEven) return true; // 只有a是偶数b不是的话,a优先级更高,返回false if (aEven && !bEven) return false; // 都是偶数的话,选大的 if (aEven && bEven) return a < b; // 都是奇数的话,顺序不影响结果 return false; });
内容的提问来源于stack exchange,提问作者Sap BH
相关产品推荐
相关产品推荐

