如何解决我不知道为什么我不能在 C++ 中初始化数组的数组
我在 C++ 中有这段代码:
std::array<std::array<int,2>,4> elements = {{1,2},{1,2}};
它说:错误:结构初始化器中的元素过多
我不知道为什么会这样。如果我写它有效:
std::array<std::array<int,2}};
解决方法
要初始化一个 std::array
对象,您需要 两个 大括号对:外部大括号用于对象本身,内部用于数组。
这意味着你的初始化需要看起来像
std::array<std::array<int,2>,4> elements = {{{1,2},{1,2}}};
,
std::array
在 aggregate initialization 中很微妙;它期望子对象(底层数组)有更多的大括号。
std::array<std::array<int,2}}};
// ^ ^ <- for std::array
// ^ ^ <- for underlying array
您收到初始化器 {{1,2}}
的错误,因为有 4 个 {1,2}
来初始化子对象(底层数组),但 std::array
只有一个,即多余的元素。>
以下是一些如何初始化您正在使用的类型的对象的示例。
#include <iostream>
#include <array>
int main()
{
std::array<std::array<int,4> elements1 = { 1,2,1,2 };
std::array<std::array<int,4> elements2 = { { 1,2 } };
std::array<std::array<int,4> elements3 =
{
{
{ 1,2 },{ 1,2 }
}
};
std::array<std::array<int,4> elements4 =
{
{
{ { 1,2 } },{ { 1,2 } }
}
};
std::array<std::array<int,4> elements5 =
{
{
{ 1,2 }
}
};
return 0;
}
请注意以下来自 C++ 17 标准(11.6.1 聚合)的引用
12 个大括号可以在初始化列表中被省略,如下所示。如果 初始化列表以左大括号开头,然后是后面的 以逗号分隔的初始化子句列表初始化元素 一个子聚合体;有更多是错误的 初始值设定项子句而不是元素。但是,如果初始化列表 对于子聚合不以左大括号开头,那么就足够了 使用列表中的初始化子句来初始化元素 子集料的;任何剩余的初始化子句都留给 初始化当前聚合的下一个元素 子聚合是一个元素。
std::array
被定义为包含另一个聚合的聚合。
这是一个演示程序,使引用更清晰,显示了二维数组的初始化
#include <iostream>
int main()
{
const size_t M = 4,N = 4;
int a[M][N] =
{
{ 1,3,4 },5,6,7,8,{ 8,5 },4,};
return 0;
}
您可以将 std::array<std::array<int,4 >
类型的表示想象为以下演示文中结构 B 的声明。
#include <iostream>
struct A
{
int a[2];
};
struct B
{
A b[4];
};
int main()
{
B b1 =
{
};
B b2 =
{
{
}
};
B b3 =
{
{
{
}
}
};
B b4 =
{
{
{
{ {},{} }
}
}
};
return 0;
}
调查程序。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。