繁体   English   中英

使二维数组中所有元素的快速方法在C ++中变为某些非零值

[英]fast way to make all elements in a 2d array becomes certain non-zero value in C++

假设我要为2d数组中的所有元素分配5。 首先我尝试了memset

int a[3][4];
memset(a, 5, sizeof a);

int a[3][4];
memset(a, 5, sizeof(a[0][0])*3*4);

但是相同的结果是all the elements becomes 84215045

然后我尝试使用fill_n ,它显示fill_n失败。 似乎fill_n无法处理2D数组。

那么,有没有一种快速的方法可以将2d数组中的所有元素设置为某个值? 在C ++中?

********************************************************************************
UPDATE

感谢@paddy的答案。 实际上fill_n确实有效。 我的使用方式是这样的,无法使用我的编译器进行构建。

fill_n(a,3*4,5);

@paddy的答案是正确的,我们可以将其用于二维数组。

fill_n(a[0],3*4,5); 

然后我尝试了更多,我发现我们实际上可以使用它来处理3d数组,但是应该像这样。 a[3][4][5]

fill_n(a[0][0],3*4*5,5); 

不幸的是, memset仅在将每个字节设置为一个值时有用。 但这在您要设置字节组时不起作用。 由于2D数组的内存布局,从第一个值开始使用std::fill_nstd::fill实际上是可以的:

std::fill_n( a[0], 3 * 4, 5 );
std::fill( a[0], a[3], 5 );  // Note a[3] is one past the end of array.

根据您的编译器的不同,类似的内容甚至可能被矢量化以更快地执行。 但是即使没有这些,您也不必担心速度std::fill足够快。

sizeof(a)将为您提供指针的大小(以字节为单位),这取决于它正在运行的系统。 在32位系统或OS上为4(32位= 4字节),在64位系统/ OS上为8。

要获得3x4元素的int数组的大小,应使用sizeof(int)*(3 * 4)。

因此,您应该使用memset(a,5,sizeof(int)*(3 * 4));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM