使用0填充多维数组元素

时间:2010-08-27 17:37:40

标签: c++

我有一个2d,我想在不循环所有元素的情况下将元素设置为零

int a[100][200];

我无法在申报时初始化它们。

12 个答案:

答案 0 :(得分:24)

尝试

int a[100][200] = {{0}};

如果初始化一些(但不是全部)元素,其余元素将初始化为零。在这里,您只是显式初始化第一个子数组的第一个元素,编译器正在处理其余部分。

答案 1 :(得分:13)

尝试memset(a,0,sizeof(a));

这只是用0字节覆盖数组使用的内存。除非您确实知道自己的操作,否则不要对用户定义的数据类型执行此操作。还有std::fillstd::fill_n,这是更多的C ++ ish(但这里不是最简单的方法)。

答案 2 :(得分:3)

C ++允许多维数组通过基本元素指针完全迭代。所以你可以使用std::fill并将它传递给第一个非阵列元素

std::fill(a[0] + 0, a[99] + 100, 0);

在C中,这是正式不允许的,并且您需要分别遍历每个子数组,因为迭代超出第一个子数组的过去结束指针会导致C中的未定义行为。但是,在实践中,这仍然有效。

答案 3 :(得分:3)

对于C ++,您可以使用算法标题中的std:fill方法。

int a[x][y];
std::fill(a[0], a[0] + x * y, 0);

因此,在您的情况下,您可以使用此:

int a[100][200];
std::fill(a[0], a[0] + 100 * 200, 0);

当然,可以为任何int值更改0。

答案 4 :(得分:2)

memset(a, 0, 100 * 200 * sizeof(int));应该这样做。

答案 5 :(得分:2)

“我无法在声明点初始化它们”究竟是什么意思? “不知道怎么做”?或者“无法在那里修改代码”?

C ++语言有一个功能,可以在声明

时将整个数组初始化为0
int a[100][100] = {};

(注意,0)之间不需要明确的{}。你能用它吗?

如果你不能,那么你的选择是:使用memset - hack,1D-reinterpretation-hack或通过遍历数组显式设置每个元素(有或没有帮助fo { {1}})。

答案 6 :(得分:1)

如果此数组在文件范围或函数范围声明但是为'static',则它会自动初始化为零,您无需执行任何操作。在程序启动时,这仅适用于一个初始化;如果你需要重置它,你必须自己编码。我会使用memset

如果它在没有静态的函数范围内声明,你需要使用memset或显式初始化器 - 单个= { 0 }就足够了,你不需要写出所有200 2 像其他人建议的那样归零。

答案 7 :(得分:0)

提到的memset方法(memset(a,0,sizeof(a));)会起作用,但是以C ++的方式(根据您的标记)和使用向量做什么呢?

std::vector<std::vector<int> > a;
a.assign(100, std::vector<int>(200));

答案 8 :(得分:0)

我测试了这个解决方案并且有效。

int arr[100][200];

for (int i=0; i<100; i++)
    for (int j=0; j<200; j++) (arr[i][j] = 0);

for (int i=0; i<100; i++)
    for (int j=0; j<200; j++) cout << (arr[i][j]);

答案 9 :(得分:0)

许多答案使用fill指针算法。这可以更简单:

int a[N][K];
fill(a[0], a[N], 0);

基本上,a[N]是多维数组之后的第一个内存地址,无论有多少维度。这也有效:

int a[N][K][L][M];
fill(**a[0], **a[N], 0);

这里的星号取消引用指向int*类型的指针(数组括号取消引用int****int***,两个星号完成剩下的工作。

答案 10 :(得分:0)

由于尺寸定义明确,所需要的只是尾部括号......

int a[100][200]();

答案 11 :(得分:0)

使用

int a[100][200]={0};

这会将数组的所有元素初始化为0