C++의 STL 표준 라이브러리는 미리 정의된 여러가지 함수 객체들을 제공한다.
이러한 표준 함수객체들을 사용하기 위해서는 #include <functional> 을 포함해야 한다.
이 함수객체들은 알고리즘의 비교,정렬을 위한 기준으로 사용될 수 있다.
less<> 는 알고리즘에서 디폴트 기준으로 사용되는 오름차순 정렬이다.
negate<type>() | - 파라미터 |
plus<type>() | 파라미터1 + 파라미터2 |
minus<type>() | 파라미터1 - 파라미터2 |
multiplies<type>() | 파라미터1 * 파라미터2 |
divides<type>() | 파라미터1 / 파라미터2 |
modulus<type>() | 파라미터1 % 파라미터2 |
equal_to<type>() | 파라미터1 == 파라미터2 |
not_equal_to<type>() | 파라미터1 != 파라미터2 |
less<type>() | 파라미터1 < 파라미터2 |
greater<type>() | 파라미터1 > 파라미터2 |
less_equal<type>() | 파라미터1 <= 파라미터2 |
great_equal<type>() | 파라미터1 >= 파라미터2 |
logical_not<type>() | !파라미터 |
logical_and<type>() | 파라미터1 && 파라미터2 |
logical_or<type>() | 파라미터1 || 파라미터2 |
1. 함수어댑터
함수어댑터란, 함수객체를 특정값 또는 특정함수와 결합시킨 함수객체이다.
이러한 함수어댑터 역시 <functional> 에 정의되어 있다.
표현식 | 효과 |
bind1st(op, value) | op(value, 파라미터) |
bind2nd(op, value) | op(파라미터, value) |
not1(op) | !op(파라미터) |
not2(op) | !op(파라미터1, 파라미터2) |
find_if(coll.begin(), coll.end(), bind2nd(greater<int>(), 42));
이 코드에서 bind2nd(greater<int>(), 42) 는 정수타입 변수가 42보다 큰지를 판단하는 결합된 함수객체를 생성한다.
bind2nd는 greater<> 와 같은 이항 함수객체를 단항 함수객체로 변형시킨다.
즉, bind2nd의 두번째 인자를 이항 함수객체의 두번째 인자로 사용하는 것이다.
따라서, greater<>는 42를 두번째 인자로 하여 호출한다.
함수어댑터는 스스로가 함수객체이다. 따라서, 함수어댑터를 함수객체와 결합하여 사용할 수 있다.
pos=find_if(coll.begin(), coll.end(), not1(bind2nd(modulus<int>(), 2)));
이 코드에서 bind2nd(modulus<int>(), 2) 는 모든 홀수에 대해 1(참) 을 반환한다.
따라서, 이 표현식은 홀수값을 갖는 첫번째 원소를찾는 기준이된다.
하지만 not1() 은 이 결과를 반전시키므로, 짝수값을 갖는 첫번째 원소의 위치를 반환한다.
2. 멤버함수를 위한 함수어댑터
이것은 STL 컨테이너의 각각의 원소들에 대해서 멤버함수를 호출시켜주는 함수 어댑터이다.
표현식 | 효과 |
mem_fun_ref(op) | 객체에 대해서 멤버함수 op() 를 호출 |
mem_fun(op) | 객체의 포인터에 대해서 멤버함수 op()를 호출 |
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
class person{
private:
string name;
public:
person(char *nm):name(nm){}
void print()const{
cout<<name<<endl;
}
void printWithPrefix(string prefix)const{
cout<<prefix<<name<<endl;
}
};
int main(){
vector<person> coll;
coll.push_back(person("AAAA"));
coll.push_back(person("BBBB"));
coll.push_back(person("CCCC"));
coll.push_back(person("DDDD"));
//각각의 원소에 대해서 멤버함수 print()를 호출
for_each(coll.begin(), coll.end(), mem_fun_ref(&person::print));
//각각의 원소에 대해서 멤버함수 printWithPrefix()를 호출
//"person : " 은 멤버함수 printWithPrefix() 의 인자로 전달
for_each(coll.begin(), coll.end(), bind2nd(mem_fun_ref(&person::printWithPrefix), "person : "));
}
3. 일반 함수들을 위한 함수어댑터
표현식 | 효과 |
ptr_fun(op) | *op(파라미터) |
*op(파라미터1, 파라미터2) |
ptr_fun() 은 기존의 일반 함수들을 함수객체와 같은 형태로 사용하도록 하는 함수객체 어댑터이다.
예를들어, 각각의 인자에 대해 무언가를 검사하는 일반 전역함수를 가지고 있을때
bool check(int elem);
이러한 경우 조건을 만족하는 첫번째 원소를 찾으려면 다음과 같이 호출한다.
pos=find_if(coll.begin(), coll.end(), ptr_fun(check));
조건을 만족하지않는 첫번째 원소를 찾으려면 다음과 같이 사용할 수 있다.
pos=find_if(coll.begin(), coll.end(), not1(ptr_fun(check)));
사용자가 두개의 인자를 사용하는 전역함수를 가지고 있다고 가정한다면
pos=find_if(coll.begin(), coll.end(), not1(bind2nd(ptr_fun(strcmp), "AAA")));
strcmp는 두개의 string이 같을경우 false를 반환한다.
따라서, 이 구문은 "AAA" 와 같은 첫번째 string의 위치를 반환한다.
[출처] 함수객체 어댑터 functor adapter|작성자 9KM ArtOfRudah
'STLTemplate > STL & EffectiveSTL' 카테고리의 다른 글
함수자 (0) | 2012.11.01 |
---|---|
어댑터에 사용하기 위한 사용자 정의 함수객체 (0) | 2012.11.01 |
compose_f_gx f(gx)) 조립함수객체 어댑터 (0) | 2012.11.01 |
클래스 구조체 자료형 정렬하기 (0) | 2012.11.01 |
STL algoritm + 클래스노드포인터 (0) | 2012.11.01 |