如何初始化和填充矢量<矢量>类型的矢量<int>?

How do I initialize and fill a vector of type vector<vector<int> >?

本文关键字:gt lt 类型 int 矢量 初始化 填充      更新时间:2023-10-16

我正在尝试返回一个write-a函数,该函数创建一个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;
    }
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);

您需要执行(假设您的矩阵大小为ROWS x COLS

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

并且不再需要CCD_ 12。2D数组的整个内存现在都被保留了,所以你只需要使用arr[i][j]来写入它。代码也比使用push_back快一点,因为push_back在需要调整向量大小时会减慢重新分配的速度。

但是,尽量避免此类嵌套向量,因为它们速度较慢。请使用平面矢量,并从2D映射到1D,反之亦然。

没错,不要使用复杂的结构可以节省时间和精力,加快项目进度。使用2D阵列而不是push_back使用arr[i][j]