2015-06-19 67 views
0

我有这个函数是假设返回向量中的所有可能的整数置换。代码是基于现有的代码来完成字符串的置换,我试图对它进行改造以使用向量,但显然,它们的工作方式与我想的不同。 我会感谢您提供的任何帮助,谢谢。使用向量的递归排列

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); 
     } 
    } 
+0

哪些错误与'的std :: next_permutation' ? – PSIAlt

+0

@PSIAlt,嗨,我很抱歉,我忘了提及,我不允许使用STL算法中的任何函数 – XDProgrammer

+0

只是好奇。为什么“不允许”? – PSIAlt

回答

0

迭代器只能与你

+0

感谢您的回复,是否有另一种方法来擦除元素而不使用迭代器? – XDProgrammer

+0

你可以使用'temp.begin()+ pos'来擦除。所以,你可以循环使用int位置并以这种方式擦除 –

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

+0

嗨,感谢这段代码,我测试它并工作..显然我不允许使用算法STL ..但是这真的很有帮助,我只需要进行改造,相应地.. 谢谢.. – XDProgrammer