5

如何在 C++ 中将二维数组归零?我需要两个 for 循环吗?

来自其他高级语言,我想知道为什么 C++ 不将数组初始化为有意义/合理的默认值?我是否总是需要声明一个数组,然后立即将其“归零”?

4

4 回答 4

12

C++ 语言试图遵循“你不为你不使用的东西付费”的原则。它不会将基本类型初始化为任何默认值,因为您可能不希望它发生。无论如何,该语言为您提供了显式请求此类初始化的机会。

在声明的那一刻,您可以使用初始化程序并简单地执行此操作

int array[10][20] = {};

或者,对于动态分配的数组

int (*array)[20] = new int[10][20]();

这将给出一个零初始化数组。不需要循环。

但是,如果您想将现有数组归零,那么您确实必须使用更复杂的东西。在整数类型的情况下,一个好的旧的memset将起作用。对于指针或浮点类型,情况通常更复杂。memset取决于实现定义的属性,可能会起作用,也可能不会起作用。在任何情况下,标准库都可以通过提供诸如std::fill.

于 2012-11-17T03:44:36.550 回答
1

取决于你如何创建它。

二维向量,是的,两个 for 循环(因为整数是原始类型 - 类将调用默认 ctor)。

二维数组?不,你可以memset或者bzero一次,因为内存都是连续的,无论是使用malloc还是new.

于 2012-11-17T03:42:48.163 回答
0

只有标量类型的 C 样式数组可以选择在不初始化的情况下创建。要将这样的数组初始化为零,您只需提供一个空的初始化程序:

int a[3][3] = {}; // 3x3 zeroes

当您来自“其他高级语言”时,请考虑减少 2D 数据的低级类型(有多个矩阵库:boost.ublas和 Eigen 可能是最受欢迎的,当然在 boost 中也有多数组)

于 2012-11-17T03:44:52.877 回答
0

您可以简单地使用memset将零放在任何地方。记录在这里

memset(pointer, value_to_put, num_bytes);

所以在这种情况下,你会有一些类似的东西

memset(myArray, 0, sizeof(arrayElement) * width * height);
于 2012-11-17T03:41:21.240 回答