如何使用初始化列表在C++中初始化数组

13

我有一个与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;
};

但是这会出现警告:

"非类类型的列表初始化器不得带括号。"

那么我该如何确保这些数组被初始化为所有0值?

2个回答

16

你可以按照错误提示进行操作。你可以使用花括号初始化器来初始化数组,例如

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

如果将列表留空,则任何缺失的初始化程序都会将数组中的元素初始化为零。


那么我该如何初始化任何一个数组,例如全部赋值为-1? - Adrian
@Adrian 所有的元素都是 -1 还是只有第一个元素? - NathanOliver
假设所有值都为0,但i的所有值应该为-1。 - Adrian
@Adrian 如果你想让它们成为非0的值,你需要像这样指定 : x{-1, -2, -3} ... 或者在构造函数体中进行赋值。 - NathanOliver

3
你可以通过完全不使用括号来实现这一点:
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 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,且您正在使用,则您还可以使用以下语法:int a[1024] = {[0 ... 1023] = 5};来将数组的一部分初始化为一个值(即使这会导致生成的代码大小与初始化数组的大小成比例增加)。

我强烈建议您查看有关数组初始化的此页面。

以及此答案获取更多详细信息


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