functor와 operator()에 대해서

알고리즘 문제를 풀면서 STL 자료구조를 자주 사용하게 됐는데,
정렬 기준을 재정의해주는 함수를 작성하다가 functor의 존재를 알게 되었다.

function은 일반적으로 우리가 알고 있는 함수이다.
functor을 구글에 쳐보면 수학적 용어로 함자라고 나오는데,
이 개념이 프로그래밍에서 어떻게 쓰이는지 궁금해서 찾아보았다.

functor는 일반적으로 함수의 기능을 갖고 있다.
거기에 더해서 어떤 특징이 있을까?

첫 번째 특징은 상태를 가질 수 있다.
바꿔말하면, 클래스나 구조체와 같이 쓰인다는 것이다.
그래서 functor를 함수 객체(function object)라고도 한다.

두 번째 특징은 범위를 갖는 자료구조에서 해당하는 범위에 적용 가능하다.
배열과 리스트류의 자료구조를 정렬하거나 모든 데이터를 더하는 연산을 할 때
functor의 이름을 한번 호출하면서 목적을 해결할 수 있게 된다.
그래서 STL과 함께 자주 사용된다.


그러면 operator()와의 관계는 무엇일까?
operator()는 함수 호출을 재정의하는 용도로 사용한다.
즉, operator() 내부에 함수의 기능을 작성하고 사용할 때
우리는 함수를 호출하듯이 간편하게 사용할 수 있게 된다.
다시 말하면, 위의 functor의 역할은 함수를 보다 스마트하게 쓰고 싶어서 인데,
operator()를 사용하여 함수를 정의하면, 다른 불필요한 과정없이
사용하고자하는 함수의 기능만 간편하게 사용할 수 있게 된다.

더해서, sort에서 비교 하는 함수 cmp를 단순한 기존 형태로 구현할 수 있지만,
priority_queue<T, vector<T>, cmp<T>> pq에서 쓰일 때에는 operator()를 재정의하여 구현해야하는 차이점이 있다.

아래 코드는 단순하게 더하는 역할을 하는 sum의 예제와
절댓값 순서대로 정렬하고 싶어서 만든 cmp와
C++에서 제공되는 greater을 자료구조에서 활용할 때의 예제이다.



**
struct sum
{
    int m = 0;
    int operator()(int i)
    {
        return m += i;
    }
};

struct cmp {
    bool operator()(int x, int y)
    {
if (x + y == 0)
  return x > y;
        return abs(x) > abs(y);
    }
};

/*
template struct greater {
    bool operator()(const T& x, const T& y) const
    {
        return x > y;
    }
    typedef T first_argument_type;
    typedef T second_argument_type;
    typedef bool result_type;
};
*/

int main() {
    sum s;
    cout << s(10) << endl;    //"10"
    cout << s(20) << endl;    //"30"

    priority_queue<int, vector<int>, cmp> pq;
    priority_queue<int, vector<int>, greater<int>> pq;
    vector<int> v;
    int arr[5] = {4, 3, 2, 5, 1};
    sort(v.begin(), v.end(), cmp());
    sort(v.begin(), v.end(), greater<int>());
    sort(arr, arr + 5, cmp());
    sort(arr, arr + 5, greater<int>());
}
**

댓글

이 블로그의 인기 게시물

[PS] BOJ 20543번 폭탄 던지는 태영이

프로그래밍에서 실수형의 부정확성

프로그래머스 2019 윈터코딩 온라인 테스트를 보았다. (풀이)