#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, " ") );
}