使用向量的递归排列

时间:2015-06-19 19:45:39

标签: c++ vector permutation

我有这个函数,假设返回向量内所有可能的整数排列。代码基于现有的代码进行字符串排列,我试图将其重新设计为向量,但显然,它们并没有像我想象的那样工作。 我将非常感谢您提供的任何帮助,谢谢;

vector<vector<int>> permute(vector<int> &v1, vector<int> &v2){
    vector<vector<int>> v;
    if( v1.empty() )
    {
        v.push_back(v2);
        return v;
    }
    for(auto it = v1.begin(); it != v1.end(); it++){
        vector<int> temp1 = v1;
        temp1.erase(it);          //there's a runtime error on this line
        vector<int> temp2 = v2;
        temp2.push_back(*it);

        permute(temp1, temp2);
    } 

    return v;
}

这是置换字符串的原始代码。

void string_permutation( std::string& orig, std::string& perm )
    {
        if( orig.empty() )
        {
            std::cout<<perm<<std::endl;
            return;
        }

        for(int i=0;i<orig.size();++i)
        {
            std::string orig2 = orig;

            orig2.erase(i,1);

            std::string perm2 = perm;

            perm2 += orig.at(i);

            string_permutation(orig2,perm2);
        } 
    }

2 个答案:

答案 0 :(得分:1)

你走了:

   template < typename T>
   void vec_permute( std::vector<T> &orig, std::vector<T> &perm)
   {
       if(orig.empty())
       {
            for( auto &x : perm)
                std::cout<<x;
            std::cout<<"\n";
            return;
       }
       for(typename std::vector<T>::size_type i=0;i <orig.size();++i)
       {
            std::vector<T> orig2(orig);
            orig2.erase(std::find(orig2.begin(),orig2.end(),orig.at(i)));
            std::vector<T> perm2(perm);
            perm2.push_back(orig.at(i));
            vec_permute(orig2,perm2);            
       }
   }

演示:http://coliru.stacked-crooked.com/a/01ded4b778aa4165

答案 1 :(得分:0)

迭代器只能与您使用

实例化的容器一起使用