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
我看到几个地方 (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