c ++尝试初始化2d数组

时间:2016-10-26 01:34:20

标签: c++ arrays initialization variable-assignment list-initialization

我创建了一个名为digits的二维数组,并希望逐个初始化每个子数组,以使我的代码更清晰。我理解以下代码有效:

string digits[2][5] = { { " - ","| |","   ","| |"," - " },{ " - ","| |","   ","| |"," - " } };

但我想知道为什么以下不起作用:

string digits[2][5];
digits[0] = { " - ","| |","   ","| |"," - " };
digits[1] = { " - ", "| |", "   ", "| |", " - " };

3 个答案:

答案 0 :(得分:2)

第二个不是初始化,它是digits元素的赋值。

string digits[2][5];                               // initialization
digits[0] = { " - ","| |","   ","| |"," - " };     // assignment of the 1st element of digits
digits[1] = { " - ", "| |", "   ", "| |", " - " }; // assignment of the 2nd element of digits

digits的元素是一个数组,原始的array不能作为一个整体分配。

  

数组类型的对象不能整体修改:即使它们   是左值(例如,可以采用数组的地址),它们不能   出现在赋值运算符的左侧

您可以使用std::arraystd::vector执行此操作,可以使用支持的初始化程序进行分配。

std::array<std::array<std::string, 5>, 2> digits;
digits[0] = { " - ","| |","   ","| |"," - " };
digits[1] = { " - ", "| |", "   ", "| |", " - " };

答案 1 :(得分:2)

初始化与赋值有很大不同。初始化是在声明(调用构造函数)时为变量赋值,而赋值则是声明然后赋值(调用赋值运算符)。 要正确分配你删除括号,然后你使用循环或手动,例如:

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


int main()
{
    string s[2][3];
    string Hi = "Hi there!";

    s[0][0] = "Hello there!";
    //....

    for(int i(0); i < 2; i++)
        for(int j(0); j < 3; j++)
            s[i][j] = Hi;

    for(int i(0); i < 2; i++)
        for(int j(0); j < 3; j++)
            cout << s[i][j] << endl;

    return 0;
}

答案 2 :(得分:1)

如果您为了清晰起见而更改此行,请考虑:

string digits[2][5] = {
        {" - ", "| |", "   ", "| |", " - "},
        {" - ", "| |", "   ", "| |", " - "}
    };

注意:考虑。缩进是一种强大的工具,但它可能被滥用。