비엄격 비교 함수의 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에는 소위 "엄격한 약한 순서 지정" 속성을 충족하는 비교 함수가 필요합니다. 그러나 해당 프로그램의 비교 기능은 요소가 동일하지만 엄격하게 서로보다 작지는 않은 것으로 간주하도록 허용합니다. 이로 인해 모호성이 발생하고 정렬 알고리즘에서 무한 루프가 발생할 가능성이 있습니다.
엄격한 약한 순서 지정 규칙
엄격한 약한 순서 지정 규칙에 따르면 비교 함수 '> ;' ('<'에도 적용 가능):
비교 함수의 의미
주어진 코드에서 비교 함수 연산자< 요소가 동일할 수 있지만(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 중국어 웹사이트의 기타 관련 기사를 참조하세요!