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_PP_SEQ_FOR_EACH_PRODUCT в Boost.Preprocessor, который может сделать это на этапе предварительной обработки.

Макрос BOOST_PP_SEQ_FOR_EACH_PRODUCT повторяет макрос для каждого декартова произведения нескольких секций.

Но я полагаю, что это не то, что вы ищете.

Если код многократного использования в порядке, то вы можете использовать Function Input Iterator в Boost.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; 
    } 
}