我有一个2d,我想在不循环所有元素的情况下将元素设置为零
int a[100][200];
我无法在申报时初始化它们。
答案 0 :(得分:24)
尝试
int a[100][200] = {{0}};
如果初始化一些(但不是全部)元素,其余元素将初始化为零。在这里,您只是显式初始化第一个子数组的第一个元素,编译器正在处理其余部分。
答案 1 :(得分:13)
尝试memset(a,0,sizeof(a));
这只是用0字节覆盖数组使用的内存。除非您确实知道自己的操作,否则不要对用户定义的数据类型执行此操作。还有std::fill
和std::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 ++语言有一个功能,可以在声明
时将整个数组初始化为0int 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