array<array<int, M>, N>的列表初始化

3

初始化二维数组时,我们可以这样做:

int data[2][2] = {{1, 2}, {3, 4}}; // OK

我们也可以使用

int data[2][2] = {1, 2, 3, 4}; // OK

当使用数组类而非基础类型时,这是可行的,因为二维数组仍然是一段连续的内存块。
array<array<int, 2>, 2> data = {1, 2, 3, 4}; // OK

这是有道理的,因为数组类没有任何额外的数据,并且最终也成为一块连续的内存。

但二维列表不起作用:

array<array<int, 2>, 2> data = {{1, 2}, {3, 4}}; // Error

我也可以进行初始化。

vector<array<int, 2>> data = {{1, 2}, {3, 4}}; // OK

但是找不到任何初始化的方法:

array<vector<int>, 2> = ????

我的问题是:

这是基本设计上的原因吗?(我猜测与编译时和运行时发生的事情有关)还是这只是我使用的编译器(GCC)的实现决策?


2
std::array<std::array<int, 2>, 2> a = {{{1, 2}, {3, 4}}}; 你需要使用双括号初始化。 - Brandon
1
编辑:2维和3维的示例:https://ideone.com/ugs1E6 对于> 1维,需要使用双括号初始化。这是在CWG 1270修订版之前,我从这里给出的示例中了解到的:https://en.cppreference.com/w/cpp/container/array 显然,曾经需要1维。 - Brandon
1
vector有一个显式构造函数,因此如果您有一个向量数组,则必须为每个子元素编写vector{1, 2}等。 - M.M
1个回答

6

std::array没有像std::vector一样的用户定义构造函数,它只包含一个底层数组。当执行聚合初始化时,需要再加上一组花括号。

array<array<int, 2>, 2> data = {{{{1, 2}}, {{3, 4}}}};
//                             ^                    ^  <- for array<array<int, 2>, 2>
//                              ^                  ^   <- for the underlying array
//                               ^      ^              <- for the 1st array<int, 2>
//                                ^    ^               <- for its underlying array
//                                         ^      ^    <- for the 2nd array<int, 2>
//                                          ^    ^     <- for its underlying array

我们可以省略大括号,如下所示:
array<int, 2> data = {1, 2};
array<array<int, 2>, 2> data = {1, 2, 3, 4};

由于大括号省略的存在:

嵌套初始化列表周围的大括号可以被省略(忽略),此时会使用尽可能多的初始化子句来初始化相应子聚合体的每个成员或元素,并使用后续的初始化子句来初始化对象的后续成员。

这意味着上述代码可以写成:

array<array<int, 2>, 2> data = {{{1, 2}, {3, 4}}};

array<array<int, 2>, 2> data = {{1, 2}, {3, 4}}; 失败是因为它被解释为:

array<array<int, 2>, 2> data = {{1, 2}, {3, 4}};
//                             ^              ^  <- for array<array<int, 2>, 2>
//                              ^    ^           <- for the underlying array
//                                      ^    ^   <- excess elements; std::array has only one underlying array

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接