如何在int类型的2d向量中推送数据

sar*_*aru 4 c++ vector multidimensional-array

我有一个向量,并希望在运行时将int数据存储到它中,我可以用这种方式将数据存储在2D向量中吗?

std::vector<std::vector <int>> normal:
    for(i=0;i<10;i++){
        for(j=0;j<20;j++){
            normal[i].push_back(j);
    }
}
Run Code Online (Sandbox Code Playgroud)

Sin*_*all 8

是的,但您还需要推送每个子向量:

std::vector<std::vector<int>> normal;
for(int i=0; i<10; i++)
{
    normal.push_back(std::vector<int>());
    for(int j=0; j<20; j++)
    {    
        normal[i].push_back(j);    
    }
}
Run Code Online (Sandbox Code Playgroud)


A. *_*nti 8

您正在操纵向量的向量。因此,在声明时normal它为空并且不包含任何元素时。

你可以:

在插入元素之前调整向量的大小

std::vector<std::vector<int> > normal;
normal.resize(20);

for (size_t i = 0; i < normal.size(); ++i)
{
    for (size_t j = 0; j < 20; ++j)
        normal[i].push_back(j);
}
Run Code Online (Sandbox Code Playgroud)

这可能比在其他答案中提出的在每一步推送一个空向量更有效。

使用平面二维数组

如果要存储二维数组,这不是最佳解决方案,因为:

  1. 您的数组数据分布在 N 个不同的动态分配缓冲区(对于 N 行)
  2. 您的数组每行可以有不同数量的列(因为没有强制要求 normal[i].size() == normal[j].size()

相反,您可以使用大小向量N * M(其中N是行M数和列数),并使用索引访问行i和列处的元素:ji + j * N

size_t N = 20;
size_t M = 20;
std::vector<int> normal;
normal.resize(N * M);

for (size_t i = 0; i < N; ++i)
    for (size_t j = 0; j < M; ++j)
        normal[i + j * N] = j;
Run Code Online (Sandbox Code Playgroud)