웹프로그래밍
C++ STL : Functor 사용하기 본문
함수객체나 함수포인터나 기능적으로는 거의 비슷하지만 함수객체가 더 뛰어난 이유중 중요한 한가지는 함수객체는 인라인이 가능하기 때문에 속도를 향상시킬 수 있다는 것 이다. 예를들어 정렬 알고리즘에 함수객체가 아닌 함수포인터를 사용하면 비교연산을 할 때마다 함수를 호출해야 하기 때문에 시간이 오래걸릴 것이다.
함수 객체는 클래스 안에 함수를 캡슐화해 놓은 것으로 함수 포인터에 대한 일반화라 할 수 있다.
함수 객체는 타입이므로 템플릿의 인수로 사용될 수 있지만 함수 포인터는 단순한 값일 뿐이므로 템플릿의 인수로는 사용할 수 없다. 연관컨테이너들은 내부적인 정렬 방식을 결정하기 위해 함수 객체를 요구하는데 여기에 함수 포인터를 쓸 수는 없다.
#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 | 인수 하나를 전달받아 논리부정(!)을 리턴한다 |
'프로그래밍일반' 카테고리의 다른 글
[스크럼 입문/개요] softhouse에서 발행한 scrum in five minutes 문서를 한글화 해 보았습니다. (0) | 2016.07.13 |
---|---|
파이썬공부 python (0) | 2016.07.13 |
C++ : 특정 클래스의 멤버함수A에서 멤버함수B를 스레드로 생성하기 (0) | 2016.07.13 |
C++ 다른 클래스의 멤버변수에 직접 접근하기 (0) | 2016.07.13 |
Link Error : winsock을 사용하는 프로그램 빌드 시 link error대처 (0) | 2016.07.13 |