在 C++ 14 中初始化二维数组 [复制]

Initializing a 2-D array in C++14 [duplicate]

提问人:FraTsuna 提问时间:8/7/2022 更新时间:8/7/2022 访问量:67

问:

最近,我开始从Deitel&Deitel的书中学习C++的标准库容器。从概念上讲,这对我来说很清楚,但是在尝试复制包含二维数组初始化的一段代码时,我遇到了问题。

书中的初始化(几乎)是这样的:

#include <iostream>
#include <array>
using namespace std;

int main(){

    array<array<int, 3>, 10> grades{{87, 96, 70},
        {68, 87, 90},
        {94, 100, 90},
        {100, 81, 82},
        {83, 65, 85},
        {78, 87, 65},
        {85, 75, 83},
        {91, 94, 100},
        {76, 72, 84},
        {87, 93, 73}};
  }

这应该没有问题,但 VisualStudioCode 返回一个错误,指出“初始化值过多”。 相反,我只是以这种方式初始化它:

#include <iostream>
#include <array>
using namespace std;

int main(){

    array<array<int, 3>, 10> grades{87, 96, 70,
        68, 87, 90,
        94, 100, 90,
        100, 81, 82,
        83, 65, 85,
        78, 87, 65,
        85, 75, 83,
        91, 94, 100,
        76, 72, 84,
        87, 93, 73};
    }

它有效,这是我所期望的,因为在前面的示例中,本书通过线性化其所有元素来初始化二维数组。 我不明白的是为什么在另一种情况下 VSC 会返回该错误,因为它应该可以正常工作。

C++ 数组 11 14 C+ +-标准库

评论


答:

0赞 Pepijn Kramer 8/7/2022 #1

这归结为一个错别字。他的作品,数数大括号。 现场演示在这里 : https://godbolt.org/z/xqTWxEEov

#include <iostream>
#include <array>
// using namespace std; // <== unlearn to do this.

int main()
{
    std::array<std::array<int, 3>, 10> grades{{
        {87, 96, 70},
        {68, 87, 90},
        {94, 100, 90},
        {100, 81, 82},
        {83, 65, 85},
        {78, 87, 65},
        {85, 75, 83},
        {91, 94, 100},
        {76, 72, 84},
        {87, 93, 73}}};

        for(const auto entry : grades)
        {
           auto [v1,v2,v3] = entry;
           std::cout << v1 << ", " << v2 << ", " << v3 << "\n";
        }
  
        return 0;
  }
0赞 Vlad from Moscow 8/7/2022 #2

类模板是一个聚合,在后台表示具有数组类型的数据成员的结构。std::array

编译器在此初始化中考虑

array<array<int, 3>, 10> grades{{87, 96, 70},
    {68, 87, 90},
    {94, 100, 90},
    {100, 81, 82},
    {83, 65, 85},
    {78, 87, 65},
    {85, 75, 83},
    {91, 94, 100},
    {76, 72, 84},
    {87, 93, 73}};

第一份清单

{87, 96, 70} 

作为阵列等级的整体初始值设定项。

要将列表视为该类型的内部元素的初始值设定项,您需要再添加一对 braces.as,如下面的演示程序所示。std::array<int, 3>

#include <iostream>
#include <array>

int main()
{
    std::array<std::array<int, 3>, 10> grades
    {
        {
            {87, 96, 70},
            {68, 87, 90},
            {94, 100, 90},
            {100, 81, 82},
            {83, 65, 85},
            {78, 87, 65},
            {85, 75, 83},
            {91, 94, 100},
            {76, 72, 84},
            {87, 93, 73}
        }
    };

    for ( const auto &row : grades )
    {
        for ( const auto &item : row )
        {
            std::cout << item << ' ';
        }
        std::cout << '\n';
    }
}

程序输出为

87 96 70 
68 87 90 
94 100 90 
100 81 82 
83 65 85 
78 87 65 
85 75 83 
91 94 100 
76 72 84 
87 93 73 

由于内部元素具有类型,因此,以此类推,您可以在每个初始值设定项列表周围再添加一对大括号,例如std::array<int, 3>

std::array<std::array<int, 3>, 10> grades
{
    {
        { {87, 96, 70} },
        //...