Notice
Recent Posts
Recent Comments
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

웹프로그래밍

C++ STL : Functor 사용하기 본문

프로그래밍일반

C++ STL : Functor 사용하기

공부모드 2016. 7. 13. 05:40

함수객체나 함수포인터나 기능적으로는 거의 비슷하지만 함수객체가 더 뛰어난 이유중 중요한 한가지는 함수객체는 인라인이 가능하기 때문에 속도를 향상시킬 수 있다는 것 이다. 예를들어 정렬 알고리즘에 함수객체가 아닌 함수포인터를 사용하면 비교연산을 할 때마다 함수를 호출해야 하기 때문에 시간이 오래걸릴 것이다.

함수 객체는 클래스 안에 함수를 캡슐화해 놓은 것으로 함수 포인터에 대한 일반화라 할 수 있다.
함수 객체는 타입이므로 템플릿의 인수로 사용될 수 있지만 함수 포인터는 단순한 값일 뿐이므로 템플릿의 인수로는 사용할 수 없다. 연관컨테이너들은 내부적인 정렬 방식을 결정하기 위해 함수 객체를 요구하는데 여기에 함수 포인터를 쓸 수는 없다.


#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct accum {
    int sum;
    accum() {sum=0;}
    void operator()(int a){
        sum+=a;
    }
};

int main()
{
    int ari[]={2,8,5,1,9};
    vector<int> vi(&ari[0], &ari[5]);

    sort(vi.begin(), vi.end());
    accum f;
    f=for_each(vi.begin(), vi.end(), f);
    
    cout << "Sum = " << f.sum << endl;

    return 0;
}


결과
sum = 20


미리 정의된 함수객체

#include <iostream>

#include <functional>

using namespace std;

 

void main()

{

     int a=1,b=2;

     int c=plus<int>()(a,b);

     cout << c << endl;

}

 

함수 객체와 그 지원 매크로, 타입 등은 모두 functional 헤더 파일에 정의되어 있으므로 이 헤더 파일을 인클루드해야 한다. main에서 정수형 변수 a와 b를 선언하고 plus 객체의 함수 ()를 호출하여 두 정수의 합을 계산했다. 여기서 plus<int>() 구문이 조금 복잡해 보이는데 앞에서 설명했다시피 디폴트 생성자 호출문이며 임시 객체를 생성한다. 생성된 임시객체로부터 ()연산자 함수를 호출하되 인수로 a, b를 넘긴 것이다. 좀 쉽게 풀어쓰면 다음 두 줄이 된다.

 

plus<int> P;

int c=P(a,b);

 

plus 클래스 템플릿으로부터 plus<int> 타입의 클래스를 구체화하고 이 클래스 타입의 객체 P를 선언한다. 그리고 P의 오버로딩된 연산자 ()를 호출했는데 이 함수가 두 인수의 합을 리턴하도록 되어 있으므로 결국 c에는 a+b인 3이 대입된다. 객체를 통해 멤버 함수를 호출했을 뿐 별로 희한할 것도 없는 예제이다. plus외에도 많은 함수 객체들이 미리 정의되어 있다.

 

함수 객체

연산

minus

 인수의 차를 계산한다.

multiplies

 인수의 곱을 계산한다.

divides

 인수를 나눈  몫을 리턴한다.

modulus

 인수를 나눈  나머지를 리턴한다.

negate

인수 하나를 전달받아 부호를 반대로 만든다.

equal_to

 인수가 같은지 비교하여 결과를 bool타입으로 리턴한다.

not_equal_to

 인수가 다른지 비교한다.

greater

 번째 인수가  번째 인수보다 큰지 조사한다.

less

 번째 인수가  번째 인수보다 작은지 조사한다.

greater_equal

 번째 인수가  번째 인수보다 크거나 같은지 조사한다.

less_equal

 번째 인수가  번째 인수보다 작거나 같은지 조사한다.

logical_and

 인수의 논리곱(&&) 결과를 리턴한다.

logical_or

 인수의 논리합(||) 결과를 리턴한다.

logical_not

인수 하나를 전달받아 논리부정(!) 리턴한다



Comments