非严格比较函数的 std::sort 异常
以下程序使用 VC 2012 编译,表现出意外的行为:
#include <algorithm> struct A { int a; bool operator<(const A& other) const { return a <= other.a; // Potential issue } }; int main() { A coll[8]; std::sort(&coll[0], &coll[8]); // Crash may occur return 0; }
问题解释
出现这个问题是因为比较函数运算符
不严格遵循std::sort的要求。根据 C 标准库(第 25.3.1.1 节),std::sort 需要满足所谓的“严格弱排序”属性的比较函数。但是,给定程序中的比较函数仅允许元素被视为相等,但不能严格小于彼此。这可能会导致歧义,并可能导致排序算法中的无限循环。
严格弱排序规则比较函数的含义
在给定的代码中,比较函数运算符
解决方案struct A { int a; bool operator<(const A& other) const { return a < other.a; // Strict comparison } };要解决此问题,比较应修改函数以严格比较元素:通过此修改,程序应按预期运行,而无需崩溃了。
以上是为什么使用非严格小于运算符时 `std::sort` 会崩溃?的详细内容。更多信息请关注PHP中文网其他相关文章!