더북(TheBook)

max_element() 함수는 최댓값 함수를 찾기 위해 보다-작은(less-than) 연산자가 정의되어 있어야 한다. 따라서 비교 함수는 다음과 같은 형태가 되어야 한다.

bool comp(const T1& a, const T2& b);

대부분의 경우 첫 번째 매개변수의 타입은 두 번째 매개변수의 타입과 같지만, 두 타입이 서로 다를 수도 있다. 유일한 전제 조건은 범위에 있는 원소들이 두 타입 T1T2 사이에 암묵적으로 변환될 수 있어야 한다는 것뿐이다. 매개변수는 const로 선언하지 않아도 되지만, 특별한 이유가 없다면 const로 선언하는 게 좋다. 어떠한 경우에도 비교 함수는 함수에 전달된 인수를 교환해서는 안 된다.

람다 표현식에 작성된 코드는 인수로 전달된 stringsize() 멤버 값을 비교한 결과를 반환만 한다. max_element()가 반환하는 반복자는 가장 긴 문자열을 가리키므로 여기에 size() 멤버를 호출해서 가장 긴 문자열의 길이를 max_len에 저장한다.

cin에서 단어를 읽어 들이는 방식은 전부터 봤던 것이다. 여기서는 Ctrl+Z를 입력했을 때 설정되는 EOF 상태를 지우기 위해 cinclear() 멤버를 호출했다. clear()를 호출하지 않으면 EOF가 설정된 상태이므로 main()에서 이후에 같은 방식으로 표준 입력 스트림에서 입력을 읽을 수 없게 된다.

단어 순차열을 읽어 들인 후에는 make_heap()을 호출해서 deque 컨테이너의 내용을 힙으로 배열한다.

이어서 단어를 추가로 읽어 들인다. 이번에는 컨테이너에 단어를 추가할 때마다 push_heap()을 호출해서 힙 정렬을 유지해야 한다. push_heap()은 컨테이너의 끝에 새 원소가 추가되었다고 가정한다. 만약 push_front()를 사용했다면 힙의 일관성이 깨지므로 프로그램이 충돌하게 된다. 출력을 보면 예상대로 잘 동작하는 것을 알 수 있다.

물론, 처음에 단어를 입력할 때마다 push_heap()을 사용했다면 make_heap()을 사용할 필요가 없다. 예제에서 이렇게 하지 않은 이유는 priority_queue 컨테이너 어댑터처럼 순차열을 복제하지 않아도 전체 순차열에 접근하거나 기반 컨테이너를 직접 제어할 수 있다는 것을 보여주기 위해서였다.

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