프로그래밍/C++

C++ - sort()의 비교함수의 조건(Strict Weak Ordering)

CastleMouse 2021. 12. 26. 22:55

C++의 sort() 함수는 직접 비교함수를 작성해서 정렬할 수 있다. 비교함수는 두 개의 파라미터를 가지며(비교하려는 원소 a와 b) bool값을 반환하도록 작성해야 한다. 이때, 두 원소의 순서가 올바르면 true, 아니면 false를 반환토록 한다. 예를 들어 오름차순 정렬을 하고 싶다면 a < b이면 true, else는 false를 반환하면 된다.

 

비교함수는 Strict Weak Ordering을 준수해야 한다. 이를 준수하지 않고 프로그램을 작성하면 비주얼 스튜디오에서는 "Expression: invalid comparator"라는 에러를 맞닥뜨릴 것이다.

 

Strict Weak Ordering은 다음의 네 가지 조건을 만족해야 한다.

 

1) irreflexivity(비반사성)

- 모든 x에 대해 R(x, x)는 거짓.

- 즉, cmp(a, a)는 false를 반환해야 한다.

 

2) antisymmetry(비대칭성)

- 모든 x, y에 대해 R(x, y)가 참이면 R(y, x)는 거짓.

- 즉 cmp(a, b) != cmp(b, a)이다.

 

3) transitivity(추이성)

- 모든 x, y, z에 대해 R(x, y)와 R(y, z)가 참이면 R(x, z)도 참.

- 즉, cmp(a, b)와 cmp(b, c)가 모두 true를 반환했다면 cmp(a, c)도 true를 반환해야 한다.

 

4) transitivity of incomparability(비비교성의 추이성)

- 모든 x, y, z에 대해 R(x, y)와 R(y, x)가 거짓이고 R(y, z)와 R(z, y)가 거짓이면 R(x, z)와 R(z, x)는 거짓

- 즉, cmp(a, b)와 cmp(b, a)가 모두 false를 반환하고 cmp(b, c)와 cmp(c, a)가 모두 false를 반환하면 cmp(a, c)와 cmp(c, a)도 false를 반환해야 한다.

'프로그래밍 > C++' 카테고리의 다른 글

C++ - 힙 관련 STL(make_heap, push_heap, pop_heap)  (0) 2022.01.04