在 C++11 中,是否有一种用一个元素初始化数组向量(我的意思是 C++ 类)的好方法,比如
std::vector<std::vector<int> > foo(3, std::vector<int>(2, 1));
用全 1 初始化一个 3x2 向量的向量?
不幸的是,数组向量的类比似乎不起作用。我真的必须使用 for 循环吗?
在 C++11 中,是否有一种用一个元素初始化数组向量(我的意思是 C++ 类)的好方法,比如
std::vector<std::vector<int> > foo(3, std::vector<int>(2, 1));
用全 1 初始化一个 3x2 向量的向量?
不幸的是,数组向量的类比似乎不起作用。我真的必须使用 for 循环吗?
也许像这样?
#include <vector>
#include <array>
#include <iostream>
int main()
{
std::vector< std::array<int, 2> > v(3, {1,1});
for(auto const& e0 : v)
{
for(auto const& e1 : e0)
std::cout << e1 << ", ";
std::cout << "\n";
}
}
输出:
1, 1, 1, 1, 1, 1,
“我们为什么要使用两个括号?”
我问题中的原始代码是
std::vector< std::array<int, 2> > v(3, {{1,1}});
但我决定取下第二对牙套。他们一直在那里抑制 clang++ 警告:通常,std::array
包含一个(原始)数组。一对大括号足以初始化这个内部数组,但是 clang++ 发出警告,因为{1,1}
(一对大括号)的元素用于初始化这个内部数组的元素,而不是聚合(外部std::array
)本身。铿锵声++:
警告:建议围绕子对象的初始化大括号
我在标准中查找了这个,它需要在 [array.overview]/2
数组是可以使用语法初始化的聚合(8.5.1)
array<T, N> a = {
初始化列表};
其中initializer-list是以逗号分隔的列表,最多可
N
包含其类型可转换为的元素T
。
参数传递使用与这种形式的初始化相同的规范(称为复制初始化,[dcl.init]/15),因此可以保证使用一对大括号。
OTOH,不需要std::array
包含(原始)数组。