8.2(목) C++ - 함수어답터, 부정자

from Study/C++ 2007/08/02 21:14 view 17759

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

}

Tag |

Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다