如何初始化和填充vector <vector <int>&gt;类型的向量?

时间:2015-11-12 15:45:44

标签: c++

我正在尝试返回一个写一个函数,该函数创建一个vector<vector<int> >并填充它并返回它。我试图将元素推入vector<vector int>时面临分段错误。任何人都可以帮我解决这个问题吗?

 vector<vector<int> > Solution::prettyPrint(int A) 
    {
        vector<vector<int>> arr;

        for(int x=1;x<(2*A);x++)
        {
            for(int y=1;y<(2*A);y++)
            {
                int xp=x,yp=y;
                if(x>A) xp=2*A-x;
                if(y>A) yp=2*A-y;

                int min=(xp<yp)?xp:yp;

                arr[x-1].push_back(A+1-min);
            }
        }

        return arr;
    }

3 个答案:

答案 0 :(得分:3)

arr[x-1].push_back(A+1-min);

您正在尝试访问arr[x-1],但此时arr是一个空值。

由于您知道arr的大小为2*A-1(至少这是您的代码中出现的内容),因此您可以添加

在外循环开始之前

arr.resize(2*A-1);,或直接在声明它时:

vector<vector<int> > arr(2*A-1);

您可以进一步初始化内部向量:

    for(int x=1;x<(2*A);x++)
    {
        arr[x-1].resize(2*A-1);
        for(int y=1;y<(2*A);y++)

并替换

arr[x-1].push_back(A+1-min);

arr[x-1][y-1]=(A+1-min);

答案 1 :(得分:2)

您需要这样做(假设您的矩阵大小为ROWS x COLS

vector<vector<int>> arr(ROWS, vector<int>(COLS));

并且不再需要push_back了。现在保留了2D数组的整个内存,因此您只需使用arr[i][j]进行写入即可。代码也比使用push_back快一点,因为push_back在需要调整向量大小时确实会减慢重新分配。

然而,尝试避免这种嵌套向量,因为它们很慢。使用平面矢量,并从2D到1D映射,反之亦然。

答案 2 :(得分:0)

没有合适的结构可以节省您的时间和精力,让您的项目更快。使用2D数组代替push_back使用arr[i][j]