我有一个二维数组,我想在不循环所有元素的情况下将元素设置为零。
int a[100][200];
我不能在声明的时候初始化它们。
我有一个二维数组,我想在不循环所有元素的情况下将元素设置为零。
int a[100][200];
我不能在声明的时候初始化它们。
尝试一下
int a[100][200] = {{0}};
如果你初始化了一些(但不是所有)元素,剩下的元素将被初始化为零。在这里,你只显式地初始化了第一个子数组的第一个元素,编译器会处理其余部分。
= {0}
也可以工作,但这样做可能会更好地避免编译器警告。 - Potatoswatter= {};
。 - Johannes Schaub - litb尝试使用memset(a,0,sizeof(a));
这将简单地用0字节覆盖数组所使用的内存。除非您确实知道自己在做什么,否则不要对用户定义的数据类型执行此操作。还有更加C++风格但不是最简单的方法:std::fill
和std::fill_n
。
sizeof(a) * sizeof(int)
吗? - Mikhail对于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);
C++允许通过基元素指针完全迭代多维数组。因此,您可以使用std::fill
并将其传递给第一个非数组元素。
std::fill(a[0] + 0, a[99] + 100, 0);
“我无法在声明时初始化它们”是什么意思?是“不知道如何”还是“无法在那里修改代码”?
C++语言具有将整个数组在声明点初始化为0的功能。
int a[100][100] = {};
0
)。你能使用它吗?memset
技巧、1D重新解释技巧或通过迭代数组(使用或不使用std::fill
)来显式设置每个元素。goto
或switch
跳过声明进入变量作用域时。 - Potatoswatter许多答案使用了指针算术和 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***
,两个星号完成其余工作)。memset(a, 0, 100 * 200 * sizeof(int));
应该就可以了。
memset
来完成这个任务。memset
或显式初始化器——一个单独的= { 0 }
就足够了,您不需要像其他人建议的那样写出所有2002个零。提到的memset
方法(memset(a,0,sizeof(a));
)可以工作,但是如果按照您的标签使用C++方式并使用向量呢?
std::vector<std::vector<int> > a;
a.assign(100, std::vector<int>(200));
我测试了这个解决方案,它有效。
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]);