-1

我有 5 个包含字符串的列表:附加、单词、中间、组合、前置。(或 s0、s1、s2、s3、s4)。每个列表在程序开始时可以随机包含 0 到 256 个字符串。

如何输出所有可能的组合?

我尝试了级联的 for() 循环,但如果中间的列表包含 0 个字符串(例如 s2),则会失败。

4

3 回答 3

1

我假设你使用std::vector<string> s1,s2,s3,s4,s5;
如果你喜欢丑陋的代码:

int i = 1;
for (auto itr1 = s1.begin(), end1 = s1.end(); itr1 != end1; ++itr1)
    for (auto itr2 = s2.begin(), end2 = s2.end(); itr2 != end2; ++itr2)
        for (auto itr3 = s3.begin(), end3 = s3.end(); itr3 != end3; ++itr3)
            for (auto itr4 = s4.begin(), end4 = s4.end(); itr4 != end4; ++itr4)
                for (auto itr5 = s5.begin(), end5 = s5.end(); itr5 != end5; ++itr5)
                    std::cout<<"solution "<<i++<< ": "<< *itr1 << " - " << *itr3<< " - " << *itr4<< " - " << *itr5 <<std::endl;

它并不优雅,但在 sX.size()==0 时不会失败。

我希望它有帮助!

于 2013-08-26T12:34:43.363 回答
0

为什么不放一个 if 来检查列表是否为空?

于 2013-08-26T12:18:08.827 回答
0

我假设您的示例要排列数组中的单词

而且由于 C++ 被标记,我更喜欢关注(使用vectorof string

#include <algorithm>
#include <string>
#include <iostream>
#include <vector>
#include <iterator>

int main()
{

    std::vector <std::string> v ={ "append", "word", 
                       "middle", "combo", "prepend"};

    //Use v.push_back to add any number of strings

    std::sort(v.begin(), v.end());
    do {
        std::copy(v.begin(), v.end(), 
                  std::ostream_iterator<std::string>(std::cout, " "));
        std::cout<<std::endl;
    } while(std::next_permutation(v.begin(), v.end()));
}

我很确定你已经知道 256 字符串你会等到256!

于 2013-08-26T12:34:07.247 回答