考虑这个数组,例如

#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/

10-11 16:01