2013-04-28 1 views
0

У меня проблемы с отладочным кодом. Не могли бы вы мне помочь? Спасибо! Этот код реализует перестановку вектора ints. Я попытался отладить его и нашел проблему, но я не знаю, почему это неправильно. Этот код дает мне ошибку времени выполнения и когда я пытался распечатать то, что находится внутри вектора «cv» после того, как я вставляю «cur» в cv, он просто ничего не может напечатать, но перед вставкой содержимое «cv» может быть распечатано , Я смущен, когда я ошибаюсь.Перестановка вектора ints

#include<iostream> 
#include<vector> 

using namespace std; 

vector<vector<int> > permutation(vector<int> &v){ 
    vector<vector<int> > ret; 
    if(v.empty()) { 
     return ret; 
    } 

    if(v.size()==1){ 
     int cur=v.back(); 
     v.pop_back(); 
     vector<int> cv; 
     cout<<"cur "<<cur<<endl; 
     cv.push_back(cur); 
     ret.push_back(cv); 
     return ret; 
    } 
    int cur=v.back(); 
    v.pop_back(); 
    vector<vector<int> > temp=permutation(v); 
    vector<int>::iterator it; 
    cout<<"temp.size() "<<temp.size()<<endl; 
    for(int i=0; i<temp.size(); i++){ 
     for(it=temp[i].begin(); it!=temp[i].end(); it++){ 
      //for(int p=0; p<temp[i].size(); p++) cout<<temp[i][p]; 
      //cout<<endl; 
      vector<int> cv(temp[i]); 
      //for(int p=0; p<cv.size(); p++) cout<<cv[p]; 
       //cout<<endl; 
      cv.insert(it, cur); 
      for(int p=0; p<cv.size(); p++) cout<<cv[p]; 
      cout<<endl; 

      ret.push_back(cv); 
     } 
     vector<int> cv(temp[i]); 
     cv.push_back(cur); 
     ret.push_back(cv); 
    } 
    return ret; 
} 

int main(){ 
vector<int> v; 
v.push_back(1); 
v.push_back(2); 
v.push_back(3); 
v.push_back(4); 
vector<vector<int> > ret=permutation(v); 
for(int i=0; i<ret.size(); i++){ 
    for(int j=0; j<ret[i].size(); i++) cout<<ret[i][j]; 
    cout<<endl; 

} 

} 
+0

Если это не что-то вроде домашнего задания, где нужно сделать все по своему усмотрению, вы можете посмотреть на 'std :: next_permutation' и/или' std :: random_shuffle'. –

+0

Спасибо, но на самом деле мне нужно реализовать пермутацию. – diane

ответ

4
for(it=temp[i].begin(); it!=temp[i].end(); it++){ 
.... 

     cv.insert(it, cur); 

Вы можете использовать итератор из temp, чтобы установить положение в cv
Также

 for(int i=0; i<ret.size(); i++){ 
     for(int j=0; j<ret[i].size(); i++) cout<<ret[i][j]; 
//         ^I believe j meaned 
+0

Причина, по которой я использую итератор, - это использовать функцию вставки вектора, она позволяет только итератору. cv - это другой вектор, который имеет тот же момент с temp [i] в ​​начале, и вставляю что-то в него и вставляю его в ret. – diane

+0

@dianedan Где вы хотите вставить свою центу? В любом случае вы должны использовать итератор, который выполняет итерацию 'cv' для вставки в' cv' – alexrider

+0

Я хочу вставить значение в cv и использовать итератор. – diane