다음을 통해 공유


C++ 표준 라이브러리의 함수 개체

함수 개체 또는 functor는 구현하는 모든 형식입니다operator(). 이 연산자는 호출 연산자 또는 경우에 따라 애플리케이션 연산자라고 합니다. C++ 표준 라이브러리는 기본적으로 함수 개체를 컨테이너의 정렬 기준 및 알고리즘에서 사용합니다.

함수 개체는 일반 함수 호출에 비해 두 가지 주요 이점을 제공합니다. 첫 번째는 함수 개체에 상태를 포함할 수 있다는 점입니다. 두 번째는 함수 개체가 형식이므로 템플릿 매개 변수로 사용할 수 있다는 점입니다.

함수 개체 만들기

함수 개체를 만들려면 형식을 만들고 다음과 같이 구현 operator()합니다.

class LessThanFunctor
{
public:
    bool operator()(int a, int b)
    {
        return a < b;
    }
};

int main()
{
    LessThanFunctor less_than;
    int a = 5;
    int b = 7;
    bool ans = less_than(a, b);
}

main 함수의 마지막 줄은 함수 개체를 호출하는 방법을 보여 줍니다. 이 호출은 함수에 대한 호출처럼 보이지만 실제로는 형식을 호출 operator() 합니다 LessThanFunctor . 함수 개체 호출과 함수의 이러한 유사성은 함수 개체라는 용어가 나타난 방식입니다.

함수 개체 및 컨테이너

C++ 표준 라이브러리는 헤더 파일에 여러 함수 개체를 <functional> 포함합니다. 이러한 함수 개체의 용도 중 하나는 컨테이너의 정렬 기준입니다. 예를 들어 set 컨테이너는 다음과 같이 선언됩니다.

template <class Key,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<Key>>
class set;

두 번째 템플릿 인수는 함수 개체 less입니다. 이 함수 개체는 첫 번째 매개 변수가 두 번째 매개 변수보다 작은 경우 반환 true 합니다. 일부 컨테이너는 해당 요소를 정렬하므로 컨테이너에는 두 요소를 비교하는 방법이 필요합니다. 비교는 함수 개체를 사용하여 수행됩니다. 함수 개체를 만들고 컨테이너에 대한 템플릿 목록에서 지정하여 컨테이너의 고유한 정렬 기준을 정의할 수 있습니다.

함수 개체 및 알고리즘

함수 개체의 또 다른 사용은 알고리즘에 있습니다. 예를 들어 remove_if 알고리즘은 다음과 같이 선언됩니다.

template <class ForwardIterator, class UnaryPredicate>
ForwardIterator remove_if(
    ForwardIterator first,
    ForwardIterator last,
    UnaryPredicate pred);

remove_if 에 대한 마지막 인수는 부울 값을 반환하는 개체 함수( predicate)입니다. 함수 개체 true의 결과가면 요소가 반환 remove_if된 새 끝을 벗어나기 위해 이동됩니다. 인수 <functional> 에 대해 헤더에 pred 선언된 함수 개체를 사용하거나 직접 만들 수 있습니다.

참고 항목

C++ 표준 라이브러리 참조