【问题标题】:Convert nested C loops into a single boost index?将嵌套的 C 循环转换为单个 boost 索引?
【发布时间】:2012-06-06 18:59:24
【问题描述】:

我正在慢慢学习boost,并试图找到一种简单的方法来转换以下C++ sn-p:

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。

【问题讨论】:

    标签: c++ boost cartesian-product


    【解决方案1】:

    Boost.Preprocessor 中有 BOOST_PP_SEQ_FOR_EACH_PRODUCT 可以在预处理步骤中执行此操作。

    BOOST_PP_SEQ_FOR_EACH_PRODUCT 宏为多个序列的每个笛卡尔积重复一个宏。

    但我想这不是你想要的。

    如果一些可重用的代码没问题,那么您可以使用Boost.Iterator 中的Function 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 2023-02-15
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 2012-11-06
      • 1970-01-01
      相关资源
      最近更新 更多