반응형

http://tingcobell.tistory.com/296


Boost 목록
 

링크 : http://tingcobell.tistory.com/295




Boost.foreach 이용한 예제

#include <string>
#include <iostream>
#include <boost/foreach.hpp>
int main()
{
 std::string hello( "Hello, world!" );
 BOOST_FOREACH( char ch, hello )
 {
  std::cout << ch;
 }
 return 0;
}

std::for_each의 라이브러리를 BOOST_FOREACH 라는 매크로를 이용하여 만들어 놓여있습니다. 
이것은 주로 string 계열의 문자를 char 배열의 문자로 하나씩 복사 string의 '\0'의 문자열까지 반복적인 iterator 방식을 취하여 복사하는 형식을 취하고 있습니다.

Boost foreach에서 제공하고 있는 타입은 (Supported Sequence Types )

  • STL containers
  • arrays
  • Null-terminated strings( char and wchar_t )
  • std::pair of iterator

일반적으로 STL containers을 제공하고 있습니다. 





#include <string>
#include <iostream>
#include <list>
#include <boost/foreach.hpp>
int main()
{
 //std::string hello( "Hello, world!" );
 std::list<int> list_int;
 list_int.push_back(1);
 list_int.push_back(2);
 list_int.push_back(3);
 list_int.push_back(4);
 list_int.push_back(5);
 list_int.push_back(6);
 list_int.push_back(7);
 list_int.push_back(8);
 BOOST_FOREACH( int ch, list_int )
 {
  std::cout << ch;
 }
 
 list_int.clear();
 return 0;
}

조금 전에 위에서 언급했듯이 standard c++에서 제공하고 있는 <list>을 이용하여 BOOST_FOREACH에서 어떻게 반응하는지 보여주고 있는 예제 입니다.


자 이해가 참 쉬죠잉~*



여기서 보셔야 할 부분은 short 에서 int 로 형변환에 대해서 다루고 있습니다.

 short array_short[] = {1,2,3};
 BOOST_FOREACH( int i, array_short )
 {
  // The short was implicitly converted to an int
  std::cout << i << std::endl;
 }



deque iterator 에 관련되서 iterator 지원하는지 여부를 검사하였습니다.


 std::deque<int> deque_int;//( /*...*/ );
 deque_int.push_back(1);
 deque_int.push_back(2);
 deque_int.push_back(3);
 int i = 0;
 BOOST_FOREACH( i, deque_int )
 {
  std::cout << " cout i : " << i << std::endl;
  if( i == 0 ) 
  {
   std::cout << "i == 0 " << std::endl;
   return -1;
  }
  if( i == 1 ) 
  {
   std::cout << "i == 1" << std::endl;
   continue;
  }
  if( i == 2 ) 
  {
   std::cout << "i == 2" << std::endl;
   break;
  }
 }
 deque_int.clear();

문제 없이 동작하는 코드입니다. 어차치 테스트용도 이기 때문에 사용 문법에 대해서만 이해를 하고 어디에 쓰면

좋을지 곰곰히 생각해보셔도 될것 같습니다.  

만약에 상당히 큰 container가 존재가 하면 어떠한 iterator.begin() 부터 end()까지 순차적으로 full 스캔 한다고

생각을 해보죠. 그렇다고 한다면 문법자체도 쉽고 사용법도 용이하기 때문에 만약 속도적인 측면에서 더 낳은

역량을 가진다면 어떻게 할까요? 

당신의 선택은 어떻게 처리 하시겠습니까?

포스팅 하다가 갑자기 궁금해지기 시작하네요. 

* 속도 비교. iterator 와 관련하여 데이터가 1만? 또는 2만? 3만 10만 20만 30만 40만 60만 100만? 
* 얼마 되지 않는 데이터 비교? 1만 이하?

테스트 결과








ㅇ Iterator::vector 테스트 결과



ㅇ Boost을 이용한 BOOST_FOREACH 결과

ㅇ 테스트에 사용한 source


//BOOST_FOREACH

#include <apr-1/apr_time.h>
#include <iostream>
#include <vector>
#include <boost/foreach.hpp>

int main()
{

        std::vector<int> testVector;



        for( int i = 0; i < 1000000 ; i++ )
        {
                testVector.push_back( i );
        }

        apr_time_t startTime = apr_time_now();
        std::cout << "Data Count : " << testVector.size() << std::endl;
/*
        for( std::vector<int>::iterator iter = testVector.begin(); iter != testVector.end(); iter++)
        {
                //std::cout << *iter << std::endl;
        }
*/
        BOOST_FOREACH( int i, testVector )
        {
                //std::cout << i << std::endl;
        }
        apr_time_t endTime = apr_time_now();

        apr_time_t resultTime = endTime - startTime;
        std::cout << "result Time : " << resultTime << std::endl;


        testVector.clear();

        return 0;
}


//iterator vector 을 이용한 테스트 소스
#include <apr-1/apr_time.h>
#include <iostream>
#include <vector>
#include <boost/foreach.hpp>

int main()
{

        std::vector<int> testVector;



        for( int i = 0; i < 1000000 ; i++ )
        {
                testVector.push_back( i );
        }

        apr_time_t startTime = apr_time_now();
        std::cout << "Data Count : " << testVector.size() << std::endl;

        for( std::vector<int>::iterator iter = testVector.begin(); iter != testVector.end(); iter++)
        {
                //std::cout << *iter << std::endl;
        }
/*
        BOOST_FOREACH( int i, testVector )
        {
                //std::cout << i << std::endl;
        }
*/ 
        apr_time_t endTime = apr_time_now();

        apr_time_t resultTime = endTime - startTime;
        std::cout << "result Time : " << resultTime << std::endl;


        testVector.clear();

        return 0;
}

리눅스에서 apr 라이브러리를 이용하여 시간을 측정하였습니다.

네 전 윈도우 잘 모릅니다..-0-;;;; 대략 시간 구하는거 알고 있지만, 편리한 걸 선택했습니다.


ㅇ 결론 
BOOST라고 하면 단순하게 안정화된 라이브러리 이기 때문에 빠를 것이라고 생각했었다. 하지만 테스트를 이용하여

사용해 본 결과 빠르지 않다는 결론을 얻었다. 지금의 테스트를 본다면 단순 무리수가 많은 테스트 일 수 있다. 

왜냐면 BOOST에 적용되어 있는 BOOST_FOREACH 매크로의 경우 내부 하단에서 처리 하는 시간이 많이 걸릴 수

있는 부분이기에 생각해 볼 필요성은 있다. 하지만 단순 테스트의 경우 BOOST_FOREACH 매크로 사용보다는 순수

iterator가 좋다는 결론을 얻을 수 있다.





   

반응형

'메타프로그래밍 > Boost::' 카테고리의 다른 글

boost::any  (0) 2013.02.13
boost::variant  (0) 2013.02.13
boost::random  (0) 2013.01.29
Boost::mpl  (0) 2012.12.25
boost::thread  (0) 2012.12.25

+ Recent posts