【发布时间】:2020-04-14 02:44:49
【问题描述】:
我看到几个地方 (e.g) 可以像这样初始化 2-dim 向量
vector<vector<int> > vec(3, vector<int>(2, 0));
我在想的是这段代码被评估为以下
auto tmp = vector<int>(2, 0);
vector<vector<int> > vec(3, tmp);
如果我是正确的,那么vec 的 3 个元素都指的是同一个引用。
也就是说修改vec[0][1]也会修改vec[1][1]。
如果我错了,C++如何使vec中每个元素的初始化成为不同的引用?
【问题讨论】:
-
参数被复制,因此它们不会引用同一个对象。
-
如果它们都指向同一个对象,那么修改三个元素中的任何一个都会导致整个对象被完全改变。
-
你显然已经习惯了另一种默认引用语义的语言。在 C++ 中,值语义是默认值,因此默认值是
tmp将被复制三次(创建三个不同的实例,它们都是tmp的副本)而不是引用三次。 (可以显式强制引用语义,但std::vector无法做到这一点) -
@Peter 这意味着即使使用我的伪代码(后一个代码为
tmp),vec的所有 3 个元素也指不同的向量 -
每个
vector都包含一个指向动态分配数组的指针,因此vector是连续的。vector的vectors 需要多个vectors,每个都有自己的指针,指向自己的动态分配的数组。外部vector包含一个指向内部vector数组的指针,而每个内部vectors 包含一个指针,该指针执行包含其行或列数据的不同数组。
标签: c++ multidimensional-array vector std