더북(TheBook)

전체 범위가 힙이라면 is_heap_until() 함수는 끝 반복자를 반환하게 되므로 if 문에서는 끝 반복자를 역참조하지 않게 확인해줘야 한다. 또한, 지정된 범위가 원소 두 개 이하일 때도 끝 반복자를 반환한다. 매개변수 두 개를 쓰는 is_heap_until() 함수는 기본 조건자로 less<>를 사용한다.

STL에서 제공하는 마지막 연산은 힙 범위를 정렬하는 sort_heap() 함수다. 주어진 범위가 힙이 아니라면 런타임에 충돌하게 된다. 범위를 지정하는 두 반복자를 받는 함수는 범위에 지정된 원소들이 최대 힙이라고 가정하고(즉, less<> 인스턴스를 사용해 배열된 힙), 원소들을 오름차순으로 정렬한다. 당연한 얘기지만, 정렬한 결과는 최대 힙이 아니게 된다. sort_heap()을 사용하는 예제를 보자.

std::vector<double> numbers {2.5, 10.0, 3.5, 6.5, 8.0, 12.0, 1.5, 6.0};
std::make_heap(std::begin(numbers), std::end(numbers)); // 결과: 12 10 3.5 6.5 8 2.5 1.5 6
std::sort_heap(std::begin(numbers), std::end(numbers)); // 결과: 1.5 2.5 3.5 6 6.5 8 10 12

정렬한 결과를 보면 최대 힙이 아니지만, 최소 힙이 되었고, 이는 그림 3-7의 트리에서도 확인할 수 있다. 힙은 완벽하게 정렬되지 않아도 되지만, 완벽하게 정렬된 모든 순차열은 힙이 된다.

▲ 그림 3-7 최대 힙을 정렬한 결과는 최소 힙이다

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