'C++' Functor

토스트·2025년 4월 24일
0

'C++' basic

목록 보기
18/35

펑터(Functor)

() 연산자(operator())를 오버로딩한 클래스의 객체이며, 간단히 말해 함수처럼 동작하는 객체를 의미합니다. 이 객체는 함수처럼 호출할 수 있습니다.
함수 객체(Function Object)라고도 불립니다.

<간단한 예시>

#include <iostream>
using namespace std;

class Adder {
    int to_add;
public:
    Adder(int n) : to_add(n) {}

    int operator()(int x) {
        return x + to_add;
    }
};

int main() {
    Adder add(5); 

    cout << add(10);
}

<결과값>

장점

  • 클래스의 멤버 변수를 통해 상태저장할 수 있습니다. (예시의 to_add)
  • 객체이기 때문에 상속하거나 템플릿으로 일반화가 가능하고, 여러 알고리즘에서 재사용하기 쉽습니다.
  • STL에서 정렬, 탐색 등 다양한 알고리즘에서 사용자 정의 조건을 함수 객체로 전달할 수 있습니다.
  • 펑터의 코드는 인라인화 할 가능성이 높습니다.

참고사항

요즘은 펑터의 모든 장점을 가지고 있으면서도 코드를 더 간결하게 표현할 수 있다는 점에서 펑터보다 람다 함수가 더 많이 쓰여지는 추세입니다.
STL 내부에서는 아직 기본적인 펑터가 사용되는 곳이 많이 있고, 특정 조건에서는 오히려 람다보다 더 간결하게 표현할 수 있기 때문에 펑터 또한 알아두면 좋습니다.

<실제 사용되는 펑터 예시>

#include <iostream>
#include <vector>
#include <algorithm> 
#include <functional> // greater와 less 펑터가 포함된 헤더

using namespace std;

int main() {
    vector<int> v = { 5, 1, 4, 2, 3 };

    sort(v.begin(), v.end(), greater()); // greater() 내림차순 펑터

    cout << "Descending results : ";

    for (const int & n : v) {
        cout << n << ' ';
    }

    cout << endl;

    sort(v.begin(), v.end(), less()); // less() 오름차순 펑터

    cout << "Ascending results : ";

    for (const int& n : v) {
        cout << n << ' ';
    }

    return 0;
}

<결과값>

0개의 댓글