大家好,我正在尝试写一个会返回一个的函数 给定矢量的所有排列的向量。例如,对于输入[1,2], 输出应为[[1,2],[2,1]]。对于输入[1,2,3],输出应该 是[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 。注意 排列的顺序在输出向量中并不重要。
我使用以下逻辑递归生成排列:
以下是一个测试用例:
io1
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
ostream & operator <<(ostream & out, vector<int> printVector) {
out << "[ ";
for(int i=0; i<printVector.size();i++) {
out << printVector[i] << " ";
}
out << "]";
return out;
}
ostream & operator <<(ostream & out, vector< vector<int> >
printVectorOfVectors) {
out << "[" << endl;
for(int i=0; i<printVectorOfVectors.size(); i++) {
out << printVectorOfVectors[i] << endl;
}
out << "]";
return out;
}
vector< vector<int> > generatePermutations(vector<int> baseVector) {
if(baseVector.size() == 1) {
vector< vector<int> > temp;
temp.push_back(baseVector);
// DEBUG
cout << "ROOT CASE , RET PERM : " << endl << temp << endl;
// \DEBUG
return temp;
}
else {
vector< vector<int> > temp;
int elem = baseVector[0];
baseVector.erase(baseVector.begin());
// DEBUG
cout << "ELEM : " << endl << elem << endl;
cout << "BASE VECTOR : " << endl << baseVector << endl;
// \DEBUG
vector< vector<int> > processPermutationsVector = generatePermutations(baseVector);
// DEBUG
cout << "PROCESS PERMS : " << endl << processPermutationsVector << endl;
// \DEBUG
for(int i=0; i<processPermutationsVector.size(); i++) {
vector<int> v_i = processPermutationsVector[i];
// DEBUG
cout << "V_i : " << endl << v_i << endl;
// \DEBUG
for(int k=0; k<v_i.size()+1; k++) {
vector<int>::iterator it = v_i.begin();
cout << "k : " << k << endl;
cout << "ORG PERM : " << endl << v_i << endl;
v_i.insert(it+k, elem);
cout << "PUSH PERM : " << endl << v_i << endl;
temp.push_back(v_i);
cout << "RET PERMS : " << endl << temp << endl;
v_i.erase(it+k);
cout << "CLEANED PERM : " << endl << v_i << endl;
}
}
return temp;
}
}
int main() {
vector<int> testVector{1,2};
cout << "TEST VECTOR : " << endl << testVector << endl;
vector< vector<int> > testPermutationsVector = generatePermutations(testVector);
cout << "TEST PERMUTATIONS VECTOR" << endl << testPermutationsVector << endl;
return 0;
}
在codechef online c ++ ide上执行的代码给出了SIGABRT的运行时错误 - 在./prog' ;:free()中出错:下一个大小无效(快)。 新创建的排列不会插入向量矢量&#34; temp&#34;。请帮忙。
答案 0 :(得分:0)
问题在于
v_i.insert(it+k, elem);
使迭代器it
无效,但迭代器在这里再次使用
v_i.erase(it+k);
替代代码
v_i.insert(v_i.begin()+k, elem);
和
v_i.erase(v_i.begin()+k);
运行而不会崩溃。并且已经提到的operator<<
的修复似乎给出了正确的结果。