더북(TheBook)

2.5.4 원소를 정렬하고 병합하기

algorithm 헤더에 정의된 sort() 함수 템플릿을 쓰려면 랜덤 액세스 반복자가 필요하다. 리스트 컨테이너에는 랜덤 액세스 반복자가 없고, 양방향 반복자만 있으므로 리스트에 있는 원소들에 sort() 알고리즘을 적용할 수 없다. 그렇다고 방법이 전혀 없는 것은 아니다. list 템플릿에 sort() 함수 멤버가 별도로 정의되어 있다. sort()는 두 가지 버전이 제공된다. 인수 없는 sort() 멤버 함수는 리스트 원소들을 오름차순으로 정렬한다. 두 번째 버전은 두 원소를 비교하는 조건자를 정의한 람다 표현식이나 함수 객체를 인수로 받는다. 조건자는 하나 이상의 인수를 받고 bool 값을 반환하는 함수를 말한다. list 컨테이너의 sort() 멤버는 이항 조건자를 인수로 받는다. 이항 조건자는 조건자의 매개변수가 두 개라는 뜻이다. 일부 알고리즘은 단항 조건자, 즉 매개변수가 하나인 조건자를 인수로 받는다.

리스트의 sort() 멤버 호출에 조건자를 인수로 사용한 예는 다음과 같다.

“Jules” “Jim” “Janet” “Jane” “Hugo” “Hannah” “Ann” “Alan”

functional 헤더에 정의된 greater<T> 템플릿을 사용했다. greater<T>는 타입 T 객체를 비교하는 함수 객체를 정의하고 있다. 즉, 첫 번째 인수가 두 번째 인수보다 크다면 operator()() 함수 멤버가 true를 반환한다. functional 헤더에는 조건자가 다양한 템플릿으로 정의되어 있고, 이 책에서 종종 보게 될 것이다. 정렬을 실행한 다음에 리스트 원소들은 다음과 같다.

“Jules” “Jim” “Janet” “Jane” “Hugo” “Hannah” “Ann” “Alan”

이제 리스트의 이름들은 내림차순으로 정렬되어 있다. greater<T> 조건자의 간단한 버전도 있으며 다음과 같이 사용할 수 있다.

names.sort(std::greater<>());         // 함수 객체는 퍼펙트 포워딩을 사용한다
 

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.