c++ 中带有 std::vector 的二维数组 - 容器

2d array with std::vector in c++ - container

我试图通过制作 EdgeWeights 向量的向量来制作二维数组(它用于邻接矩阵),但我无法理解嵌套容器的功能。

我正在构建前面提到的结构,

std::vector<std::vector<EdgeWeight> > M = 
    std::vector<std::vector<EdgeWeight>>(num_edges, std::vector<EdgeWeight>(num_nodes));

但我无法理解正在发生的事情。为什么参数会按照该顺序到达它们执行的位置?此外,一旦创建,我不明白如何访问容器的元素。这是如何工作的?

编辑:我猜测将边权重添加到邻接矩阵是这样的

M.at(u).at(v) = weight; //M is the matrix.

模板 class std::vector 具有以下构造函数

explicit vector(size_type n, const T& value, const Allocator& = Allocator());
explicit vector(size_type n, const Allocator& = Allocator());

第一个构造函数允许定义一个包含 n 个元素的对象,这些元素最初由 value

初始化

而不是定义

std::vector<std::vector<EdgeWeight> > M = 
    std::vector<std::vector<EdgeWeight>>(num_edges, std::vector<EdgeWeight>(num_nodes));

你可以简单地写

std::vector<std::vector<EdgeWeight> > M( num_edges, std::vector<EdgeWeight>(num_nodes) );

因此,在此定义中,您创建对象 M,其中包含由 std::vector<EdgeWeight>(num_nodes) 初始化的 std::vector<EdgeWeight> 类型的 num_edges 个元素。也就是说,每个元素依次是使用第二个构造函数创建的 num_nodes 个元素的向量。

您可以将其想象为创建一个具有 num_edges 行和 num_nodes 列的矩阵。只有每一行都是 std::vector<EdgeWeight> 类型的对象,您需要为其调用一个构造函数来指定必须在该行中创建多少列。

我不是很明白你在做什么,但是

std::vector<std::vector<EdgeWeight> > M

这是一个二维向量,它可以包含另一个 EdgeWeight 类型的向量,即

std::vector<EdgeWeight> N;  
N.push_back(this value here is passed to the constructor of you EdgeWeight class);  

然后:

M.push_back(N);