본문 바로가기

개발 관련 기타/C++

[C++] std::max, std::max_element 또는 std::sort 에서 compare 함수의 역할

template< class T, class Compare >
T max( std::initializer_list<T> ilist, Compare comp );
  • std::initializer_list 관련해서는 다른 문서를 읽어보면 좋아요.
template< class ForwardIt, class Compare >
ForwardIt max_element( ForwardIt first, ForwardIt last, Compare comp );
  • ForwardIt는 한쪽 방향으로만 전진하는 Iterator를 뜻합니다.
template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
  • RandomIt는 순서에 상관없이 원소에 임의 접근이 가능한 Iterator를 뜻합니다.

위에 보시다 싶이 모두 Compare 함수를 갖고 있습니다.

bool compare(const Type1 &a, const Type2 &b);
  • std에서는 compare 함수를 위와 같은 signature로 만들길 추천하고 있습니다.
  • Type 1과 Type2는 ForwardIt, RandomIt 등이 deference (역참조) 됬을 때 나오는 자료형으로 맞추길 권하고 있습니다.
  • compare 함수의 반환값을 통해서 인자로 들어온 a, b 값 중 어느 값이 더 크고 어느 값이 결국엔 max 인지 파악하게 됩니다.
  • compare 함수는 a가 b보다 작은 경우 true를 반환하도록 만들어져야 합니다. (이는 std::min, std::min_element 경우에도 마찬가지 입니다.
  • sort의 경우는 좀 다릅니다. 오름차순인 경우 (a가 b보다 작아서, a가 b 앞에 오는 경우) 이처럼 하면 되고. 내림차순인 경우 a가 b보다 큰 경우 true를 반환하도록 하면 됩니다.