C++如何在二维向量初始化中创建不同的向量?

How does C++ create different vectors in two dimensional vector initialization?

我看到几个地方 (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中每个元素的初始化成为不同的引用?

来自constructor参考文献

3) Constructs the container with count copies of elements with value value.

没有对 tmp 的引用,只是副本。所有单独的向量都是不同的,修改一个向量不会修改任何其他向量。

默认情况下,几乎所有 C++ 容器(包括 std::vector)都通过复制获取它们的参数,因此:

auto tmp = vector<int>(2, 0);
vector<vector<int> > vec(3, tmp);

现在,vector 创建了三个彼此完全无关的 'tmp' 副本,并将其存储在自身内部。


请注意,但是,您尝试做的事情是可能的,通过使用 std::reference_wrapper,就像这样:std::vector<std::reference_wrapper<std::vector<int>>>.

示例:

#include <vector>
#include <functional>
#include <iostream>

int main()
{
    auto tmp = std::vector<int>(2, 0);
    std::vector<std::reference_wrapper<std::vector<int>>> a(3, std::ref(tmp));
    a[0].get()[0] = 2;
    a[1].get()[1] = 10;
    a[2].get()[0] = 30;
    std::cout << "'tmp' contains: ";
    for (auto const& elem : tmp)
        std::cout << elem << " ";
}

Output:
'tmp' contains: 30 10