在C ++ 11中,有一种很好的方法来初始化一个数组向量(我的意思是C ++类),它有一个元素,比如
std::vector<std::vector<int> > foo(3, std::vector<int>(2, 1));
用全1来初始化3x2向量的载体?
不幸的是,数组矢量的模拟似乎不起作用;我真的有义务使用for循环吗?
答案 0 :(得分:5)
也许是这样的?
#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}
(一对大括号)的元素用于初始化此内部数组的元素,而不是聚合(外部{ {1}})本身。 Quoth clang ++:
警告:建议围绕子对象初始化
我在标准中看了这个,它需要在[array.overview] / 2
中数组是可以使用语法
初始化的聚合(8.5.1)
std::array
初始化列表array<T, N> a = {
其中初始化列表是逗号分隔的最多
};
元素列表,其类型可转换为N
。
参数传递使用与此初始化形式相同的规范(称为复制初始化,[dcl.init] / 15),因此使用一对大括号保证工作。
OTOH,并不要求T
包含(原始)数组。