初始化多维数组中的所有位置?

时间:2016-02-11 03:12:34

标签: c++ arrays

我实际上不能使用矢量,所以我遇到了一个难以使用的数组...

string whitelist[256][1];
fill_n(whitelist, sizeof whitelist / sizeof **whitelist, "NULL");

我也尝试了memset,但是它不起作用,它想要一个int而不是一个字符串,我也试过

whitelist[256][1] = {{0}}; 

然而我不相信它有用......我不在乎0,1是否被初始化但是我需要它来初始化256 ...

另外,我需要检查白名单[200]中是否有值,即使它未初始化,我更喜欢这个,但是从我的研究来看,无法检查它是否为空/空。

2 个答案:

答案 0 :(得分:3)

通常,对于T arr[M][N]类型的数组,您可以执行以下任一操作:

T arr[M][N]{}; // C++11 or later

value-initialize整个2-D数组与默认构造函数,或者类似于C ++ 98,

 T arr[M][N] = {}; // C++98

但是,在您的情况下,类型std::string提供默认构造函数,然后是定义

string whitelist[256][1];

为每个元素使用默认构造函数,因此数组中的每个元素都有一个确定值(即空字符串),因此您可以安全地使用它们。这当然与POD类型形成鲜明对比,其价值是不确定的,您需要使用{}将它们归零。

请注意,您甚至可以使用

之类的内容
string whitelist[256][1] = {"first", "second"};

,其余元素将默认构建。

说服自己的小例子:

#include <iostream>

struct Foo
{
    Foo(int) {std::cout << __PRETTY_FUNCTION__ << std::endl;}
    Foo() {std::cout << __PRETTY_FUNCTION__ << std::endl;}
};

int main()
{
    Foo arr[2][3] = {1,2}; // calls the int ctor 2 times, default ctor 4 times, as expected
    (void)arr; // to remove warning of non-used variable
}

Live on Coliru

答案 1 :(得分:0)

包含std::string元素的数组声明,例如

string whitelist[256][1];

将使用std::string的默认构造函数(创建一个空字符串)自动初始化每个数组元素。没有必要做任何事情。

你明显的信念是,如果没有额外的努力,你将以某种方式结束&#34;未初始化&#34;字符串在现实中没有根据。