[英]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_n
或std::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.