[英]How does C++ create different vectors in two dimensional vector initialization?
我看到几个地方( 例如)可以像这样初始化 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++ 容器(包括std::vector
)都通过复制获取其 arguments ,因此:
auto tmp = vector<int>(2, 0);
vector<vector<int> > vec(3, tmp);
现在,向量创建了三个完全不相关的 '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' 包含:30 10
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.