如何在 C++ 中将二维数组归零?我需要两个 for 循环吗?
来自其他高级语言,我想知道为什么 C++ 不将数组初始化为有意义/合理的默认值?我是否总是需要声明一个数组,然后立即将其“归零”?
C++ 语言试图遵循“你不为你不使用的东西付费”的原则。它不会将基本类型初始化为任何默认值,因为您可能不希望它发生。无论如何,该语言为您提供了显式请求此类初始化的机会。
在声明的那一刻,您可以使用初始化程序并简单地执行此操作
int array[10][20] = {};
或者,对于动态分配的数组
int (*array)[20] = new int[10][20]();
这将给出一个零初始化数组。不需要循环。
但是,如果您想将现有数组归零,那么您确实必须使用更复杂的东西。在整数类型的情况下,一个好的旧的memset
将起作用。对于指针或浮点类型,情况通常更复杂。memset
取决于实现定义的属性,可能会起作用,也可能不会起作用。在任何情况下,标准库都可以通过提供诸如std::fill
.
取决于你如何创建它。
二维向量,是的,两个 for 循环(因为整数是原始类型 - 类将调用默认 ctor)。
二维数组?不,你可以memset
或者bzero
一次,因为内存都是连续的,无论是使用malloc
还是new
.
只有标量类型的 C 样式数组可以选择在不初始化的情况下创建。要将这样的数组初始化为零,您只需提供一个空的初始化程序:
int a[3][3] = {}; // 3x3 zeroes
当您来自“其他高级语言”时,请考虑减少 2D 数据的低级类型(有多个矩阵库:boost.ublas和 Eigen 可能是最受欢迎的,当然在 boost 中也有多数组)
您可以简单地使用memset
将零放在任何地方。记录在这里
memset(pointer, value_to_put, num_bytes);
所以在这种情况下,你会有一些类似的东西
memset(myArray, 0, sizeof(arrayElement) * width * height);