考虑这个数组,例如
#include <iostream>
#include <vector>
int main(int argc, char* argv[])
{
std::vector<char> ls(3); ls[0] = 'a'; ls[1] = 'b'; ls[2] = 'c';
std::vector<char> us(3); us[0] = 'A'; us[1] = 'B'; us[2] = 'C';
std::vector<int> ns(3); ns[0] = 1; ns[1] = 2; ns[2] = 3;
std::vector<char>::const_iterator lIt;
std::vector<char>::const_iterator uIt;
std::vector<int>::const_iterator nIt ;
for(lIt = ls.begin(); lIt != ls.end();++lIt)
for(uIt = us.begin();uIt != us.end();++uIt)
for (nIt = ns.begin();nIt != ns.end();++nIt)
std::cout << *lIt << *uIt << *nIt << "\n";
}
它会产生三个 vector “aA1,...,cC3”的所有可能组合。现在,我想对它进行更改,以便在运行过程中,程序确定要经过的 vector 数量(一个,两个或三个)并生成所选 vector 的组合。还是简单地说,有没有办法在运行时生成嵌套循环块?
最佳答案
您可以按照以下方式定义递归函数:
template<class Container>
Container combinations(Container last) {
return last;
}
template<class Container, class... Containers>
Container combinations(Container curr, Containers... rest) {
auto ret = Container();
for (auto i : curr)
for (auto j : combinations(rest...))
ret.push_back(i + j);
return ret;
}
然后只需:
int n = /* number of vectors */;
switch (n) {
case 1: print_vec(combinations(ls)); break;
case 2: print_vec(combinations(ls, us)); break;
case 3: print_vec(combinations(ls, us, ns)); break;
}
当然假设一个简单的
print_vec
函数。您甚至可以通过传递用于组合两个元素的函子(而不是
combinations
)来进一步自定义operator+
,但这完全取决于您的需要。关于c++ - 在运行时定义循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28156384/