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

initializing all positions in mutlidimensional array?

本文关键字:位置 数组 初始化      更新时间:2023-10-16

我不能真正为此使用向量,所以我被困在一个数组上,我很难使用。

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

过 memset,但它在它想要一个 int 而不是一个字符串的意义上不起作用,我也尝试过

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

但是我不相信它奏效了...我不在乎 0、1 是否初始化,但我需要它来启动 256...

或者,我需要检查白名单[200] 中是否有值,即使它未初始化,我更喜欢这个,但根据我的研究,无法检查它是否为 NULL/空。

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

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

它将使用默认构造函数对整个二维数组进行值初始化,或者,对于 C++98,

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

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

string whitelist[256][1];

对每个元素使用该默认构造函数,因此数组中的每个元素都有一个确定值(即空字符串),因此您可以安全地使用它们。这当然与 POD 类型形成鲜明对比,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
}

住在科里鲁

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

string whitelist[256][1];

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

你显然相信,如果没有额外的努力,你会以某种方式最终得到"未初始化"的字符串,这在现实中是没有根据的。