初始化二维std :: vector


116

因此,我有以下内容:

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
如果您不需要比更大的空间,我建议为2d向量使用1d向量实现std::vector<int>::max_size()在这里
安德烈(Andre)

如果至少有一个答案不涉及复制内部向量,那就太好了:memset比memcpy更快(如果内联operator new,calloc甚至更好)。
Marc Glisse

Answers:


199

使用std::vector::vector(count, value)接受初始大小和默认值的构造函数:

std::vector<std::vector<int> > fog(
    A_NUMBER,
    std::vector<int>(OTHER_NUMBER)); // Defaults to zero initial value

4例如,如果要求非零值是默认值,则:

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

我还应该提到C ++ 11中引入了统一初始化,该统一初始化允许使用初始化vector,以及其他容器{}

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

如果我将std :: vector <std :: vector <int>>as 的存储类设置为static怎么办?
罢工者

39

假设您要初始化2D向量m * n,初始值为0

我们可以做到这一点

#include<iostream>
int main(){ 
    int m = 2, n = 5;

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

    return 0;
}

因为这个答案,刚刚获得了“良好答案”。其他人已经给出了相同的答案,但是在我发此帖时支持该答案的人可能与我相似,我们没有意识到其他答案实际上是相同的答案。我认为这可能是由于三个原因:1)可以立即复制,粘贴和运行此代码2)std::使其更长,人们可能希望简短直接回答;3)变量的长名称使初学者感到困惑。我也是一个初学者,真的不知道我们需要多么重要std::,需要一个可运行的代码,所以我知道每个变量的作用
Jason

35

中没有append方法std::vector,但是如果要创建一个包含的A_NUMBER向量的向量int,每个向量都包含other_number零,则可以执行以下操作:

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

8

如前所述,一般语法为:

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]
     }
}

其他答案中已经说明了示例。


3

我认为最简单的方法是:

std::vector<std::vector<int>>v(10,std::vector<int>(11,100));

10是外部或全局向量的大小,这是主要的向量,而11是内部类型为int的内部向量的大小,并且初始值初始化为100!那是我对堆栈的第一个帮助,我认为它可以帮助某人。


2

假设您要初始化一个二维整数向量,其中n行和m列均具有值' VAL '

写成

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

此VAL可以是整数类型的变量常量,例如100


1

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

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

其中,M和N是2D向量的尺寸。


1

我的c++ STL代码初始化5*3 2-D vectorzero


#include <iostream>
using namespace std;
#include <vector>
int main()
{// if we wnt to initialise a 2 D vector with 0;

    vector<vector<int>> v1(5, vector<int>(3,0));

    for(int i=0;i<v1.size();i++) 
{
        for(int j=0;j<v1[i].size();j++)

           cout<<v1[i][j]<<" ";

            cout<<endl;
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.