5

私はゆっくりと学習boostしており、次の 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 ができるようにします。

4

1 に答える 1

3

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;
    }
}
于 2012-06-01T19:49:12.497 に答える