在将vector <int>推入vector <vector <int>&gt;时,SIGABRT - free():无效的下一个大小(快)

时间:2018-02-16 20:53:12

标签: c++ vector sigabrt

  

大家好,我正在尝试写一个会返回一个的函数   给定矢量的所有排列的向量。例如,对于输入[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]] 。注意   排列的顺序在输出向量中并不重要。

  • 我使用以下逻辑递归生成排列:

    • 该函数将向量作为输入,返回向量&lt;矢量&gt;作为输出。
    • 如果输入向量的大小为1,即输入向量= [int],则输出为[[int]]
    • 其他:
      1. 从输入向量V中移除ELEM =第一个元素,并且V&#39;是第一个元素被删除的新向量
      2. 找到V&#39;的排列。使用递归函数调用。
      3. 对于排列中的每个置换向量(V&#39;),通过在所有可能的位置插入ELEM来创建新的置换向量,并将该新创建的置换向量附加到要返回的最终输出。
  • 以下是一个测试用例:

    • 输入向量= [1,2]
    • 预期产出= [[1,2],[2,1]]
    • 测试案例:
      1. 1被视为ELEM,[2]变为V&#39;
      2. V&#39;的排列I.2。 [2]是[[2]],因为它是递归的基本情况
      3. 然后,对于排列中的每个排列(V&#39;),即[[2]]中的[2],我们在[1,2]和[2,1]的所有位置加上ELEM 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;。请帮忙。

1 个答案:

答案 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<<的修复似乎给出了正确的结果。