gpt4 book ai didi

c++ - 将嵌套的 C 循环转换为单个 boost 索引?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:58 26 4
gpt4 key购买 nike

我正在慢慢学习 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。

最佳答案

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

The BOOST_PP_SEQ_FOR_EACH_PRODUCT macro repeats a macro for each cartesian product of several seqs.

但我想这不是您要找的。

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

关于c++ - 将嵌套的 C 循环转换为单个 boost 索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10851913/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com