如何使用initializer-list C ++初始化数组

时间:2017-06-12 13:19:05

标签: c++ arrays struct initialization

我有一个与C ++数组和结构相关的问题。我有一个结构:

struct npc_next_best_spot{
    npc_next_best_spot(): x({0}),
                          y({0}),
                          value(-1),
                          k(0),
                          i({0}), 
                          triple_ress({0}),
                          triple_number({0}),
                          bigI(0)
    {}

    int x[3]; 
    int y[3]; 
    double value; 
    int k; 
    int i[3]; 
    int triple_ress[3]; 
    int triple_number[3];
    int bigI;
};

但这会发出警告

  

"非类类型的list-initializer不能带括号"。

那么如何确保这些数组的初始值为0所有值?

2 个答案:

答案 0 :(得分:7)

你可以按照错误的建议去做。您可以为数组使用大括号初始值设定项,例如

npc_next_best_spot() : x{}, y{}, value(-1), k(0), i{}, triple_ress{}, triple_number{}, bigI(0) {}

保留列表空白可以正常工作,因为任何缺少的初始值设定项都会初始化数组中的元素。

答案 1 :(得分:4)

你可以完全不使用parens来实现这一点:

struct npc_next_best_spot{
    npc_next_best_spot(): x{0},
                          y{0},
                          value(-1),
                          k(0),
                          i({0}), 
                          triple_ress({0}),
                          triple_number({0}),
                          bigI(0)
    {} 

由于您使用的是统一初始值设定项,因此值得注意的是,您可以使用list-initializer以多种方式将数组初始化为零:

    int a[3] = {0}; // valid C and C++ way to zero-out a block-scope array
    int a[3] = {}; // invalid C but valid C++ way to zero-out a block-scope array

请注意,如果要将数组设置为值c!=0,则以前的语法不起作用。

int a[3] = {-1}意味着将a的第一个元素设置为-1(只是第一个元素)。另一个例子是,int a[5] = { 1, 2 };将导致1,2,0,0,0

C ++有一套很好的功能可以用来封装容器,类似下面的东西可以完成这项工作:

std::fill_n(a, 3, -1);

如果你的编译器是GCC并且你在c99工作,你也可以使用以下语法:int a[1024] = {[0 ... 1023] = 5};将数组的一部分初始化为一个值(尽管这导致了生成的代码大小与初始化数组的大小成比例。)

I strongly suggest to take a look at this page on array initialization.

this answer for further details