더북(TheBook)

함수 객체 버전은 어떤 타입이라도 인수로 받을 수 있고, 불필요한 복제를 피하기 위해 퍼펙트 포워딩을 사용한다. 따라서 비교한 인수들을 복제하지 않고 이동하므로 함수 객체 버전이 더 빠를 것이다.

물론, 필요하다면 리스트를 정렬하는 조건자를 정의해서 함수 객체로 전달해도 된다. 그렇다고 항상 객체를 정의할 필요는 없다. 클래스에 operator>()만 정의하면 std::greater<>를 그대로 사용할 수 있다. 타입에 대해 기본 비교가 아니라 다른 방식으로 비교하고 싶을 때 함수 객체의 필요성이 생긴다. 예를 들어 names 리스트에 있는 원소들을 string 객체의 표준 비교, 보다-큰(greater-than)이 아니라 이니셜이 같은 문자열을 길이로 정렬하고 싶다고 해보자. 이럴 때는 클래스를 다음과 같이 정의해야 한다.

// 이니셜이 같을 때 길이로 문자열을 정렬한다
class my_greater
{
public:
  bool operator()(const std::string& s1, const std::string& s2)
  {
    if (s1[0] == s2[0])
      return s1.length() > s2.length();
    else
      return s1 > s2;
  }
};

이렇게 정의한 my_greater 클래스로 names 컨테이너를 정렬하고 싶다고 하자.

names.sort(my_greater()); // my_greater를 사용해 정렬

이 코드를 실행한 뒤에 리스트는 다음과 같이 된다.

“Jules” “Janet” “Jane” “Jim” “Hannah” “Hugo” “Alan” “Ann”
 

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