2012-06-01 1 views
4

나는 천천히 boost을 배우고 난 니펫을 ++ 다음과 같은 C로 변환하는 간단한 방법 찾으려고 노력 해요 : 하나의 반복자 속으로중첩 된 C 루프를 단일 부스트 인덱스로 변환 하시겠습니까?

for(int i=-n;i<n+1;i++) { 
    for(int j=-n;j<n+1;j++) { 
    for(int k=-n;k<n+1;k++) { 
     cout << i << ' ' << j << ' ' << k << endl; 
    } 
    } 
} 

을 내가 돌이 할 수 있습니다. 제 모국어 python에서 (나는 그 전화를 할 수 있습니까?)이 itertools를 사용하여 한 줄입니다 :

itrtools.product(range(-n,n+1),repeat=3) 

완전한 대답은 최소한의 작업 예를 그래서 나는 RTFM 할 수있는 문서에 대한 링크를 제공 할 것입니다.

답변

2

전 처리 단계에서이 작업을 수행 할 수있는 Boost.Preprocessor에는 BOOST_PP_SEQ_FOR_EACH_PRODUCT이 있습니다.

BOOST_PP_SEQ_FOR_EACH_PRODUCT 매크로는 여러 seq의 각 데카르트 곱을위한 매크로를 반복합니다.

그러나 나는 그것이 당신이 찾고있는 것이 아닌 것으로 생각합니다.

약간의 재사용 가능한 코드가 정상이면 Boost.IteratorFunction Input Iterator을 사용하여 주어진 범위의 데카르트 곱을 생성 할 수 있습니다.

발전기

class product_generator 
{ 
    public: 
     typedef std::vector<int> result_type; 

     product_generator (int lower, int upper, unsigned int repeat) 
      : m_lower(lower), m_upper(upper) 
     { 
      for(unsigned int i = 0; i < repeat; ++i) 
      { 
       m_iters.push_back(m_lower); 
      } 
     }; 

     std::vector<int> operator()() 
     { 
      for(int& i : m_iters) 
      { 
       if(++i >= m_upper) 
        i = m_lower; 
       else 
        break; 
      } 

      std::vector<int> res; 
      for(int i : m_iters) 
       res.push_back(i); 

      return res; 
     }; 

    private: 
     int m_lower; 
     int m_upper; 
     std::vector<int> m_iters; 
}; 

이 생성기를 사용, 당신은 같은 것을 수행 할 수 있습니다

product_generator p(lower, upper, repeat); 
auto bgn = boost::make_function_input_iterator(p, (double)0); 

bgn하면 루프를 통해 형성 입력 시퀀스의 직교 제품을 생성 할 수있는 하나의 반복자입니다 입력 범위에 따라.

완전한 작동 예 :

#include <vector> 
#include <iostream> 
#include <boost/iterator/function_input_iterator.hpp> 
#include <math.h> 

int main() 
{ 
    int lower = 1; 
    int upper = 4; 
    unsigned int repeat = 3; 

    product_generator p(lower, upper, repeat); 

    for( 
      auto bgn = boost::make_function_input_iterator(p, (double)0); 
      bgn != boost::make_function_input_iterator(p, pow(upper-lower, repeat)); 
      ++bgn 
     ) 
    { 
     for(int i : *bgn) 
     { 
      std::cout << i << " "; 
     } 
     std::cout << std::endl; 
    } 
} 
관련 문제