在C++中对二维数组进行归零.循环需要2个吗

Zero a 2d array in C++. Do I need 2 for loops?

本文关键字:循环 归零 2个吗 C++ 二维数组      更新时间:2023-10-16

如何在C++中对2D数组清零?我需要两个for循环吗?

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

C++语言试图遵循"不为不使用的东西付费"的原则。它不会将基本类型初始化为任何默认值,因为您可能不希望发生这种情况。在任何情况下,该语言都为您提供了明确请求此类初始化的机会。

在声明的时候,你可以使用初始化器,只需执行

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

或者,对于动态分配的阵列

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

这将给出一个初始化为零的数组。无需循环。

但是,如果您想将现有数组清零,那么您确实必须使用更精细的方法。在整数类型的情况下,一个好的旧memset将起作用。对于指针或浮点类型,情况通常更为复杂。memset可能工作,也可能不工作,这取决于实现定义的属性。在任何情况下,标准库都可以通过提供std::fill这样的循环包装器来帮助您减少显式循环的数量。

取决于创建方式。

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

二维阵列?不可以,您可以同时使用memsetbzero,因为无论使用malloc还是new,内存都是连续的。

您可以简单地使用memset将零放在任何位置。此处记录

memset(pointer, value_to_put, num_bytes);

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

memset(myArray, 0, sizeof(arrayElement) * width * height);

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

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

由于您来自"其他高级语言",请考虑2D数据的低级别类型(有多个矩阵库:boost.ublas和Eigen可能是最受欢迎的,当然boost中也有多个阵列)