컨테이너 초기화및 Functor 예제

Computer/C/C++ 2007. 2. 27. 19:57

Retrieved From : http://blog.naver.com/ziralist?Redirect=Log&logNo=7708214
====================================================
가령 int형 배열을 생성시켜서 이를 난수로 초기화하려면 아래

예제처럼 하면될 겁니다만...(참고로 실행환경은 VC60입니다)

 

#include <iostream>
#include <algorithm>
#include <stdlib.h>

 

int main( )
{
 int nums[5];
 std::generate_n(nums, 5, rand); //여기서 난수로 초기화
 
 for(int i = 0; i < 5; i++)
  std::cout << nums[i] << ' ';
 
 system("pause");
 return 0;
}

 

이렇게 STL algorithm 헤드파일에 선언된 generate 계열함수를 사용하면

되지만 문제는 세번째 인수인 함수포인터가 반드시 int (*)(void)형의 데이

터 타입을 가져야하기 때문에 random() 같은 함수를 사용하여

 

일정 범위내의 난수로 초기화하는데 어려움을 겪게 됩니다. 하지만 이 경우

함수객체 Functor를 사용하면 어느정도 융통성을 발휘할 수가 있게 됩니다

일단 rand() 함수를 객체화하려면 함수호출 연산자 ()를 오버로딩하여

 

class CRand
{
public:
 int operator() (void) { return rand();}
};

 

이렇게 하면 됩니다 이것은 정확한 int rand(void)함수의 객체입니다

여기서 int random(int)와 같은 기능을 하는 객체로 진화시켜 봅니다

 

class CRandom
{
public:
 CRandom(int limit = RAND_MAX) : _limit(limit) {}
 int operator() (void) { return rand() % _limit;}
private:
 int _limit;
};

 

이렇게하면 적어도 기능상으로는 random() 함수와 완전히 같아지게 됩니다

또한 동시에 generate 계열 함수에도 성공적으로 적용됩니다 왜냐하면 STL

의 generate() 계열 함수는 템플릿으로 설계되어 있어

 

그 세번째 인수로 함수명을 넘기면 함수 포인터를, 클래스를 넘기면 클래스

를 파라미터로 받는 generate()가 생성되기 때문입니다. 다만 generate()

내부적으로 호출하는 함수의 prototype으로

 

(*)(void) 데이터형을 요청하기 때문에 generate()에 투입되는 함수객체의

operator() 멤버함수는 반드시 (*)(void) 데이터타입을 지켜줘야 한다는 제

약이 따르게 됩니다 하지만

 

이러한 제약이 따르는 상황에서도 함수객체, 즉 Functor는 생성자 함수를

사용하여 지맘대로 파라미터를 설정하여 인수로 넘길 수 있게되어, 다채

운 함수작동 환경을 보다 델리케이트하게 조율할 수 있습니다


일케 알기쉽게 함수포인터의 갑갑함을 벗어나 보다 유연하게 코딩하며 STL의

이른바 "일반화 알고리즘"의 혜택을 만끽할 수있다는 것이 함수객체의 자랑입

니다 또한 함수객체의 멤버함수 operator()를 인라인으로 처리하면

 

generate()와 같이 내부적으로 루프 속에서 Functor::operator()를 반복적

으로 수행하는 함수의 경우 상당한 속도개선 과를 기대할 수 있다는 잇점도

따르게 됩니다 아래에 완성된 예제를 싣습니다


 

#include <iostream>
#include <algorithm>
#include <stdlib.h>


class CRandom
{
public:
 CRandom(int limit = RAND_MAX) : _limit(limit) {}
 int operator() (void) { return rand() % _limit;}
private:
 int _limit;
};

 

int main( )
{
 int nums[5];
 std::generate_n(nums, 5, CRandom(100));
 
 for(int i = 0; i < 5; i++)
  std::cout << nums[i] << ' ';
 
 system("pause");
 return 0;
}

'Computer > C/C++' 카테고리의 다른 글

#pragma  (0) 2007.08.08
vprintf, vsprintf,... 가변 인수 함수.  (0) 2007.08.01
bitset 클래스  (0) 2007.07.02
STL - MAP  (0) 2007.02.27
STL lower_bound function 사용하기 Sample...  (0) 2007.02.27