> 백엔드 개발 > C++ > 왜 `std::sort`는 엄격하지 않은 미만 연산자와 충돌합니까?

왜 `std::sort`는 엄격하지 않은 미만 연산자와 충돌합니까?

DDD
풀어 주다: 2024-12-14 12:29:20
원래의
693명이 탐색했습니다.

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에는 소위 "엄격한 약한 순서 지정" 속성을 충족하는 비교 함수가 필요합니다. 그러나 해당 프로그램의 비교 기능은 요소가 동일하지만 엄격하게 서로보다 작지는 않은 것으로 간주하도록 허용합니다. 이로 인해 모호성이 발생하고 정렬 알고리즘에서 무한 루프가 발생할 가능성이 있습니다.

엄격한 약한 순서 지정 규칙

엄격한 약한 순서 지정 규칙에 따르면 비교 함수 '> ;' ('<'에도 적용 가능):

  • If a > b, 그다음 b !< a
  • a >= b이고 b >= a이면 a == b

    비교 함수의 의미

    주어진 코드에서 비교 함수 연산자< 요소가 동일할 수 있지만(a == b) 서로보다 작지는 않지만(a < b가 아닌) 경우를 허용하기 때문에 엄격한 약한 순서 지정 규칙을 위반합니다. 이 엄격하지 않은 동작은 std::sort의 요구 사항을 위반하며 충돌을 포함하여 정의되지 않은 동작으로 이어질 수 있습니다.

    해결 방법

    문제를 해결하려면 비교 요소를 엄격하게 비교하도록 함수를 수정해야 합니다.

    struct A {
        int a;
        bool operator<(const A& other) const {
            return a < other.a; // Strict comparison
        }
    };
    로그인 후 복사

    이 수정을 사용하면 프로그램이 오류 없이 예상대로 실행되어야 합니다. 충돌이 발생합니다.

    위 내용은 왜 `std::sort`는 엄격하지 않은 미만 연산자와 충돌합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿