전체 범위가 힙이라면 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 최대 힙을 정렬한 결과는 최소 힙이다