#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
//#include <boost\lambda\lambda.hpp>
using namespace std;
void foo( int a )
{
cout << a << " ";
}
void main()
{
int x[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//for_each( x, x+10, foo );
//for_each( x, x+10, cout << _1 ); // 익명의함수, 람다개념.
char* s[] = { "robert", "kim", "lee", "park" };
// s 배열에서park을찾고싶다.
// C의 함수를 STL 단항함수 객체에 넣고 싶을 때는
// 단항으로 바꾼다. 함수객체로 바꾼다. 0을 리턴하므로 1로 바꿔주도록 not1을 한다.
char** p = find_if( s, s+4,
not1( bind2nd( ptr_fun(strcmp), "park" ) ) );
cout << *p << endl;
}
// 함수어답터
// 기존의 만들어 놓은 함수를 함수객체로 변경하여 STL로 사용하고 싶을때 필요하다.
int Mod( int a, int b )
{
return a % b;
}
void main()
{
int x[10] = { 1, 2, 3, 4, 5, 6, 7 , 8, 9, 10 };
int* p = remove_if( x, x+10, bind2nd( ptr_fun(Mod), 2 ) );
copy( x, p, ostream_iterator<int>(cout, " ") );
}
// 부정자: 함수객체의 결과를 부정하는 함수객체를 생성한다.
void main()
{
int x[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//홀수를 제거하라.
int* p = remove_if( x, x+10, bind2nd( modulus<int>(), 2 ) );
//not1으로 감싸주면 짝수를 제거하라.
int* p = remove_if( x, x+10, not1(bind2nd( modulus<int>(), 2 ) ) );
copy( x, p, ostream_iterator<int>(cout, " ") );
}