首页 > 后端开发 > C++ > 为什么使用非严格小于运算符时 `std::sort` 会崩溃?

为什么使用非严格小于运算符时 `std::sort` 会崩溃?

DDD
发布: 2024-12-14 12:29:20
原创
695 人浏览过

Why Does `std::sort` Crash with a Non-Strict Less-Than Operator?

非严格比较函数的 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 需要满足所谓的“严格弱排序”属性的比较函数。但是,给定程序中的比较函数仅允许元素被视为相等,但不能严格小于彼此。这可能会导致歧义,并可能导致排序算法中的无限循环。

严格弱排序规则

    严格弱排序规则规定,对于比较函数 '> ;' (也适用于“
  • 如果 > b,则b!< a
如果 a >= b 且 b >= a,则 a == b

比较函数的含义

在给定的代码中,比较函数运算符

解决方案

struct A {
    int a;
    bool operator<(const A& other) const {
        return a < other.a; // Strict comparison
    }
};
登录后复制
要解决此问题,比较应修改函数以严格比较元素:

通过此修改,程序应按预期运行,而无需崩溃了。

以上是为什么使用非严格小于运算符时 `std::sort` 会崩溃?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板