用C ++归零2d数组。我需要2个循环吗?

时间:2012-11-17 03:40:10

标签: c++ arrays

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

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

4 个答案:

答案 0 :(得分:6)

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

在声明时,您可以使用初始化程序,只需执行此操作

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

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

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

这将给出零初始化数组。没有必要的循环。

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

答案 1 :(得分:1)

取决于您如何创建它。

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

二维数组?不,无论是使用memset还是bzero,您都可以mallocnew,因为内存是连续的。

答案 2 :(得分:0)

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

memset(pointer, value_to_put, num_bytes);

所以在这种情况下,你会有类似

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

答案 3 :(得分:0)

只有C样式的标量类型数组可以在没有初始化的情况下创建。要将此类数组初始化为零,您只需提供一个空的初始值设定项:

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

当你来自“其他更高级的语言”时,请考虑2D数据的低级别类型(有多个矩阵库:boost.ublas和Eigen可能是最受欢迎的,当然还有{ {3}}也在提升中)