用零初始化多维数组

9
在C++中,你可以使用以下代码初始化一个一维数组为0:
int myarray[100] = {0};

多维数组有类似的方法吗?还是我被迫使用for循环手动初始化它?


1
@CoryKramer 真的吗?我认为在“={0}”之后所有元素都将为0,因为初始化的int值为0。 - Baum mit Augen
@CoryKramer 我非常确定当你实际使用 {0} 时,这是错误的。对于其他值,你是正确的,但在这种情况下,{0} 是特殊的。 - Sam Estep
1
是的,它们都将是零。我只是想让OP知道,他们得到所有零的情况只是巧合。如果他们使用这种类型的初始化来填充数组中的所有特定数字,那不是一种好的方法。请注意,在我的示例中,所有尾随值都是0吗? - Cory Kramer
@CoryKramer 好的。然而,你的第一条评论是不正确的。int myarray[100] = {0}; 会将 myarray所有 元素初始化为 0。 - Sam Estep
3
不要鼓励在C++中使用memset,最好使用至少std::fill - Cory Kramer
显示剩余2条评论
7个回答

22

你可以完全以相同的方式进行操作。

int marr[10][10] = {0};

编辑:

这是一个 C 语言的解决方案。如果您需要 C++ 的解决方案,可以参考:

int marr[10][10] = {};

这两种解决方案对于通过变量定义大小的数组无效。例如:

int i, j = 10;
int marr[i][j];

要在C++中初始化这样的数组,请使用std::fill


2
@EdwardBlack 你一定使用了非常量大小的数组。请像这样使用: const int N = 10; int myarray[N][N] = {0}; - Shreevardhan
5
不行!不要在这个任务中推广使用 memset!虽然它在这种特定情况下可能有效,但存在太多的陷阱。这是 C++,而不是 C。请使用 std::fill - Baum mit Augen
1
@mziccard,那怎么会是无礼的呢?我并没有侮辱任何人,我只是陈述了我认为在这里使用memset非常糟糕的观点。 - Baum mit Augen
1
@BaummitAugen,用大写字母写作从来不好(NO),使用“!”也不好。你的评论第一个版本没有解释。无论如何,我点赞了你的评论,你是完全正确的 :) - mziccard
1
@EdwardBlack 在C++中,数组本身只能使用常量表达式。变长数组是由gcc和clang编译器扩展的。 - Baum mit Augen
显示剩余8条评论

8

多维数组是由多个数组组成的数组。

相同的一般数组初始化语法适用。

顺便说一下,你可以只写{},不需要在里面放置一个明确的0


我尝试过 "myarray[10][20] = {}; 但是不起作用,我得到了 "[Error] variable-sized object 'myarray' may not be initialized" 的错误提示。 - Black
@EdwardBlack 无法重现MCVE 或者就没发生过。 - Baum mit Augen
1
@EdwardBlack; 试试使用 int myarray[10][20] = {}; 替代。 - Cheers and hth. - Alf
@Cheersandhth.-Alf 抱歉,实际上我已经尝试过这种方式了,我只是在注释中简化了它:http://www.pasteall.org/59235/c。我发现只有在使用常量时才能正常工作。 - Black
@EdwardBlack:这是使用C99可变数组。它不是标准的C++代码,而且在标准模式下编译器会拒绝它。请参见(http://coliru.stacked-crooked.com/a/557be25a7ab19089)。 - Cheers and hth. - Alf

5

使用向量代替数组可以在声明和其他操作中为您提供更多的灵活性

vector<vector<int> > myarray(rows,vector<int>(columns, initial_value));

你可以像访问数组一样访问它们, 如果你仍然想使用数组,那么使用 std::fill

谢谢您提供的这个替代方案,但是使用向量也能创建3D数组吗? - Black

1
您可以使用std::memset来初始化2D数组的所有元素,如下所示:
int arr[100][100]
memset( arr, 0, sizeof(arr) )

即使您已经通过变量定义了大小,仍然可以使用此方法:
int i=100, j=100;
int arr[i][j]
memset( arr, 0, sizeof(arr) )

这样所有arr的元素都将被设置为0


0

使用2个vector容器:

std::vector<std::vector<int>> output(m, std::vector<int>(n, 0));

通过这种方式,可以声明一个大小为(m*n)的2D向量output,并将向量的所有元素初始化为0。


0

对于“适当的”多维数组(例如numpy ndarray),有几个可用的库,例如Boost Multiarray。引用示例:

#include "boost/multi_array.hpp"
#include <cassert>

int 
main () {
  // Create a 3D array that is 3 x 4 x 2
  typedef boost::multi_array<double, 3> array_type;
  typedef array_type::index index;
  array_type A(boost::extents[3][4][2]);

  // Assign values to the elements
  int values = 0;
  for(index i = 0; i != 3; ++i) 
    for(index j = 0; j != 4; ++j)
      for(index k = 0; k != 2; ++k)
        A[i][j][k] = values++;

  // Verify values
  int verify = 0;
  for(index i = 0; i != 3; ++i) 
    for(index j = 0; j != 4; ++j)
      for(index k = 0; k != 2; ++k)
        assert(A[i][j][k] == verify++);

  return 0;
}

另请参阅:高性能C++多维数组


-1
在C ++中,你也可以这样做:-
int x = 10, y= 10; int matrix[x][y] = {}; 然后二维数组将被初始化为全部为零。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接