初始化一个二维的std::vector

191

所以,我有以下内容:

std::vector< std::vector <int> > fog;

我很幼稚地初始化它,就像这样:

for(int i=0; i<A_NUMBER; i++)
{
    std::vector <int> fogRow;
    for(int j=0; j<OTHER_NUMBER; j++)
    {
         fogRow.push_back(0);
    }
    fog.push_back(fogRow);
}

感觉这样很不对... 有没有其他方式可以像这样初始化一个向量?


4
如果您不需要比 std::vector<int>::max_size() 更多的空间,我会建议您使用一维向量实现二维向量。这里 - andre
如果至少有一个答案不涉及复制内部向量,那就太好了:memset 比 memcpy 更快(如果 operator new 被内联,则 calloc 更好)。 - Marc Glisse
13个回答

352
使用接受初始大小和默认值的 std::vector::vector(count, value) 构造函数:
std::vector<std::vector<int> > fog(
    ROW_COUNT,
    std::vector<int>(COLUMN_COUNT)); // Defaults to zero initial value

如果需要将值设置为非零值,比如例如4,作为默认值,则可以进行以下操作:
std::vector<std::vector<int> > fog(
    ROW_COUNT,
    std::vector<int>(COLUMN_COUNT, 4));

我还应该提到, C++11 引入了统一初始化 (uniform initialization),它允许使用 {} 初始化 vector 和其他容器:

std::vector<std::vector<int> > fog { { 1, 1, 1 },
                                    { 2, 2, 2 } };
                           

如果我将 std::vector<std::vector<int>> 的存储类别设为 static,会发生什么? - strikersps
错误参考:“Expected parameter declarator”: https://dev59.com/2VkS5IYBdhLWcg3ws4Yk#68247443 - weiwen
这样看来,似乎首先创建了一个模板向量,然后将其复制ROW_COUNT次。那么就会创建ROW_COUNT+1个vector<int>,对吗? - Xiaofeng Zheng

149

假设你想要初始化一个大小为 m*n 的二维向量,并将其初始值设为 0。我们可以这样做:

#include <iostream>

int main(){
    int m = 2, n = 5;

    vector<vector<int>> vec(m, vector<int> (n, 0));

    return 0;
}

11
因为这个回答,我刚刚获得了“好答案”的评价。其他人已经给出了相同的答案,但是那些点赞这个答案的人可能和我当初看到这篇帖子时一样,并没有意识到一些其他答案其实是相同的答案。我认为可能有三个原因:1)这段代码可以直接复制、粘贴和运行;2)std::使代码变长,一些人可能希望得到简短明了的答案;3)变量名过于冗长会让初学者感到困惑。我自己也是一个初学者,不太清楚我们需要 std:: 有多重要,需要一个可运行的代码,以便我知道每个变量的作用。 - Jason

37

std::vector中没有append方法,但是如果你想创建一个包含A_NUMBERint向量的向量,并且每个向量包含other_number个0,则可以这样做:

std::vector<std::vector<int>> fog(A_NUMBER, std::vector<int>(OTHER_NUMBER));

11

通用的语法如已经所示:

std::vector<std::vector<int> > v (A_NUMBER, std::vector <int> (OTHER_NUMBER, DEFAULT_VALUE))  

在这里,向量'v'可以被想象成一个二维数组,有'A_NUMBER'行,有'OTHER_NUMBER'列,并且它们的初始值设置为'DEFAULT_VALUE'。

也可以写成这样:

std::vector <int> line(OTHER_NUMBER, DEFAULT_VALUE)
std::vector<std::vector<int> > v(A_NUMBER, line)

在一个二维向量中输入值类似于在一个二维数组中输入值:

for(int i = 0; i < A_NUMBER; i++) {
     for(int j = 0; j < OTHER_NUMBER; j++) {
         std::cin >> v[i][j]
     }
}

其他答案已经给出了示例....!


8

推荐的方法是使用填充构造函数,用给定的默认值初始化二维向量:

std::vector<std::vector<int>> fog(M, std::vector<int>(N, default_value));

其中,M和N是您的二维向量的尺寸。


7

以下是我亲身实践过的解决方案:

vector<vector<int>> minA{ROW_SIZE, vector<int>(COLUMN_SIZE, VALUE)};

2
有趣的是,我认为我们应该用括号而不是花括号来封装ROW_SIZE,vector<int>(COLUMN_SIZE, VALUE)(我知道你的方式也可以)。 - Alireza Amani

7
我认为最简单的方法是:
std::vector<std::vector<int>>v(10, std::vector<int>(11, 100));

10是外部或全局向量的大小,这是主要的向量,11是内部int类型向量的大小,并且初始值被初始化为100!


4

这个答案可以帮助你在声明后轻松初始化二维向量。

int n=4,m=3;
int default_value = 0;

std::vector<std::vector<int>> matrix;

matrix.resize(m, std::vector<int>(n, default_value));

3
假设您想要初始化一个包含 n 行和 m 列的二维整数向量,每个元素的值均为 'VAL'。

请按以下方式编写:

std::vector<vector<int>> arr(n, vector<int>(m, VAL));

这个VAL可以是整型变量或常量,如100。


1
这段代码片段将一个二维向量复制到另一个向量中,并清晰地展示了如何初始化二维向量。
void copyVectorToVector(vector<vector<int>> matrix) {

        int rowNumber = matrix.size();
        int columnNumber = matrix[0].size();
        vector<vector<int>> result(rowNumber, vector<int> (columnNumber, 0));

        for(int i=0;i<matrix.size();i++){
            for(int j=0;j<matrix[i].size();j++){
                result[i][j] = matrix[i][j];
                cout<<result[i][j]<<" ";
            }
            cout<<endl;
        }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接