如何从不同的组成员获得笛卡尔积? 正如标题所提到的,C++中存在一些问题。
如果我有一个std::vectortmpvec 最多有48种不同的组合。您可以这样做如何从不同的组成员获得笛卡尔积? 正如标题所提到的,C++中存在一些问题。,c++,algorithm,vector,cartesian-product,C++,Algorithm,Vector,Cartesian Product,如果我有一个std::vectortmpvec 最多有48种不同的组合。您可以这样做 bool increase(const std::vector<std::vector<int>>& v, std::vector<std::size_t>& it) { for (std::size_t i = 0, size = it.size(); i != size; ++i) { const std::size_t index
bool increase(const std::vector<std::vector<int>>& v, std::vector<std::size_t>& it)
{
for (std::size_t i = 0, size = it.size(); i != size; ++i) {
const std::size_t index = size - 1 - i;
++it[index];
if (it[index] >= v[index].size()) {
it[index] = 0;
} else {
return true;
}
}
return false;
}
void do_job(const std::vector<std::vector<int>>& v,
const std::vector<std::size_t>& it)
{
for (std::size_t i = 0; i != it.size(); ++i) {
// TODO: manage case where v[i] is empty if relevant.
std::cout << v[i][it[i]] << " ";
}
std::cout << std::endl;
}
void iterate(const std::vector<std::vector<int>>& v)
{
std::vector<std::size_t> it(v.size(), 0u);
do {
do_job(v, it);
} while (increase(v, it));
}
看到@jackson了吗?你打算怎么处理排列?我想选择每个组的头作为中继@πάνταῥεῖ: 事实上,op want.thx但是代码不能在我的笔记本上运行QQ我可以问一个关于itv.size,0u的问题吗。0u在这里是什么意思?0u是0未签名。如果您愿意,您可以在这里使用0。@jackson:演示仅在初始化初始向量时使用C++11。您可以轻松地替换它以使用C++03。
1,4,6,10
1,4,6,11
1,4,7,10
1,4,7,11
......
bool increase(const std::vector<std::vector<int>>& v, std::vector<std::size_t>& it)
{
for (std::size_t i = 0, size = it.size(); i != size; ++i) {
const std::size_t index = size - 1 - i;
++it[index];
if (it[index] >= v[index].size()) {
it[index] = 0;
} else {
return true;
}
}
return false;
}
void do_job(const std::vector<std::vector<int>>& v,
const std::vector<std::size_t>& it)
{
for (std::size_t i = 0; i != it.size(); ++i) {
// TODO: manage case where v[i] is empty if relevant.
std::cout << v[i][it[i]] << " ";
}
std::cout << std::endl;
}
void iterate(const std::vector<std::vector<int>>& v)
{
std::vector<std::size_t> it(v.size(), 0u);
do {
do_job(v, it);
} while (increase(v, it));
}