C++14 STL 철저 입문: 2.5.4 원소를 정렬하고 병합하기
homeHome 1장. 표준 템플릿 라이브러리 1.1 | 기본 아이디어 1.2 | 템플릿 1.3 | 컨테이너 1.4 | 반복자 1.4.1 반복자 얻기 1.4.2 반복자 카테고리 1.4.3 스트림 반복자 1.4.4 반복자 어댑터 1.5 | 반복자에 쓰이는 연산 1.6 | 스마트 포인터 1.6.1 unique_ptr<T> 포인터 사용하기 1.6.2 shared_ptr<T> 객체 사용하기 1.6.3 weak_ptr<T> 포인터 1.7 | 알고리즘 1.8 | 함수를 인수로 전달하기 1.8.1 함수 객체 1.8.2 람다 표현식 1.9 | 요 약 1.10 | 연습문제 2장. 순차 컨테이너 2.1 | 순차 컨테이너 2.1.1 컨테이너의 공통 함수 멤버 2.2 | array<T,N> 컨테이너 사용하기 2.2.1 원소에 접근하기 2.2.2 array 컨테이너에서 반복자 사용하기 2.2.3 array 컨테이너의 비교 2.3 | vector<T> 컨테이너 사용하기 2.3.1 vector<T> 컨테이너 생성하기 2.3.2 벡터의 용량과 크기 2.3.3 원소에 접근하기 2.3.4 vector 컨테이너에서 반복자 사용하기 2.3.6 원소를 삭제하기 2.3.7 vector<bool> 컨테이너 2.4 | deque<T> 컨테이너 사용하기 2.4.1 deque 컨테이너 생성하기 2.4.2 원소에 접근하기 2.4.3 원소를 추가하고 제거하기 2.4.4 deque 컨테이너의 내용을 대체하기 2.5 | list<T> 컨테이너 사용하기 2.5.1 list 컨테이너 생성하기 2.5.2 원소 추가하기 2.5.3 원소를 제거하기 2.5.4 원소를 정렬하고 병합하기 2.5.5 원소에 접근하기 2.6 | forward_list<T> 컨테이너 사용하기 2.7 | 반복자를 직접 정의하기 2.7.1 STL 반복자 요구사항 2.7.2 STL 접근 방식 2.8 | 요약 2.9 | 연습문제 3장. 컨테이너 어댑터 3.1 | 컨테이너 어댑터는 무엇인가? 3.2 | stack<T> 컨테이너 어댑터 생성과 사용하기 3.2.1 스택 연산 3.3 | queue<T> 컨테이너 어댑터 생성과 사용하기 3.3.1 큐 연산 3.3.2 queue 컨테이너의 실제 사용 3.4 | priority_queue<T> 컨테이너 어댑터 사용하기 3.4.1 우선순위 큐를 생성하기 3.4.2 우선순위 큐를 위한 연산 3.5 | 힙 3.5.1 힙 생성하기 3.5.2 힙 연산 3.6 | 포인터를 컨테이너에 저장하기 3.6.1 순차열 컨테이너에 포인터 저장하기 3.6.2 우선순위 큐에 포인터 저장하기 3.6.3 포인터 힙 3.6.4 기반 클래스 포인터를 담은 컨테이너 3.6.5 알고리즘을 포인터 범위에 적용하기 3.7 | 요약 3.8 | 연습문제
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 헤더에는 조건자가 다양한 템플릿으로 정의되어 있고, 이 책에서 종종 보게 될 것이다. 정렬을 실행한 다음에 리스트 원소들은 다음과 같다.
이제 리스트의 이름들은 내림차순으로 정렬되어 있다. greater<T> 조건자의 간단한 버전도 있으며 다음과 같이 사용할 수 있다.
names.sort(std::greater<>());         // 함수 객체는 퍼펙트 포워딩을 사용한다
C++14 STL 철저 입문(이하 '책')의 저작권은 아이버 호튼에게 있습니다.