std::strict_weak_order

std::strict_weak_order (엄밀 약순서 개념)

관계 R이 그 인자들에 대해 엄밀 약순서(strict weak ordering)를 부과하는지를 명세하는 개념(concept)이에요. std::sort 같은 정렬 알고리즘이 요구하는 비교 함수의 성질이에요. C++20부터 있어요.

출처: cppreference

본문

<concepts> 헤더에 정의돼 있어요.

template< class R, class T, class U >
concept strict_weak_order = std::relation<R, T, U>;

개념 strict_weak_order<R, T, U>는 관계 R이 그 인자들에 엄밀 약순서를 부과함을 명세해요.

의미 요구사항

엄밀 약순서는 다음 성질을 요구해요.

  • 비반사적(irreflexive): 모든 x에 대해 r(x, x)는 거짓.
  • 비대칭적(asymmetric): r(a, b)가 참이면 r(b, a)는 거짓.
  • 추이적(transitive): r(a, b) && r(b, c)이면 r(a, c).
  • 동치의 추이성(transitivity of equivalence): 서로 비교 불가능한(즉 r(a,b)r(b,a)도 거짓인) 요소들은 추이적 동치 클래스를 형성해야 해요. 즉 a~b(동치)이고 b~c이면 a~c여야 해요.

< 연산자처럼 "보다 작다"의 관계가 전형적인 엄밀 약순서예요. std::sort, std::set, std::map 같은 표준 라이브러리의 정렬·정렬된 컨테이너가 비교 함수에 요구하는 핵심 성질이에요.

relation과의 구분은 순전히 의미적(semantic)이에요. 정렬 알고리즘이 올바르게 동작하도록 보장하려면 비교 함수가 엄밀 약순서를 만족해야 해요.

참고 문헌

  • C++23 표준 (ISO/IEC 14882:2024): 18.7.7 Concept strict_weak_order [concept.strictweakorder]
  • C++20 표준 (ISO/IEC 14882:2020): 18.7.7 Concept strict_weak_order [concept.strictweakorder]

더 알아보기 (Learn more)

cppreference