더북(TheBook)

main()에서 정렬을 수행하는 코드는 원소들이 저장되는 컨테이너에 의존하지 않는다. 정렬을 수행하는 코드에서는 정렬하려는 데이터가 정렬 메서드에서 사용하는 연산을 지원하는 반복자로 지정되어 있기만 하면 된다. STL에는 내가 만들 수 있는 것보다도 훨씬 더 좋은 sort() 함수 템플릿이 있다는 점만 잠시 동안 무시한다면 원소가 어떤 타입이라도 정렬에 필요한 요구사항만 만족하면 정렬할 수 있는 함수 템플릿을 직접 정의할 수도 있다.

template<typename RandomIter>
void bubble_sort(RandomIter start, RandomIter last)
{
  std::cout << "정렬을 시작합니다." << std::endl;
  bool out_of_order {false}; // 값들이 정렬되지 않았으면 true
  while (true)
  {
    for (auto first = start + 1; first != last; ++first)
    {
      if (*(first - 1) > *first)
      { // 정렬되지 않았으니 값을 교환한다
        std::swap(*first, *(first - 1));
        out_of_order = true;
      }
    }
    if (!out_of_order)         // 정렬된 상태이면(교환이 필요 없음)...
      break;                   // ...완료...
    out_of_order = false;      // ...그렇지 않으면, 다시 반복
  }
}

이 템플릿 타입 매개변수는 반복자 타입으로 되어 있다. bubble_sort() 알고리즘은 for 루프에서 반복자로 산술 연산을 하기 때문에 랜덤 액세스 반복자가 필요하다. 이 알고리즘은 랜덤 액세스 반복자를 지원하는 컨테이너라면 어떤 원소라도 정렬할 수 있다. 즉, 표준 배열이나 string 객체로 정렬할 수 있다. 앞 예제의 main() 앞에 이 템플릿 코드를 추가하면 main()에서 words 벡터를 정렬하는 코드를 다음 문장으로 바꿀 수 있다.

bubble_sort(std::begin(words), std::end(words)); // words 배열을 정렬한다

반복자만 사용해서 구현할 수 있는 연산을 함수 템플릿으로 정의하면 함수 템플릿 사용이 매우 유연해진다. 정의하려는 알고리즘이 범위에 대한 연산이라면 만드는 것도 비슷하다. bubble_sort() 템플릿을 이용하는 프로그램의 완성본은 예제 다운로드의 Ex2_02A.cpp에 있다.

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