c++ - 使二维数组中的所有元素在 C++ 中成为某个非零值的快速方法

标签 c++

假设我想将 5 分配给二维数组中的所有元素。首先我尝试了 memset

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

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

但是同样的结果是所有的元素都变成了84215045

然后我尝试使用 fill_n,它显示构建失败。 fill_n 似乎无法处理二维数组。

那么有没有什么快速的方法可以让二维数组中的所有元素都为某个值呢?在 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 仅对将每个字节 设置为一个值有用。但是当你想设置字节组时,这将不起作用。由于二维数组的内存布局,实际上可以从第一个值开始使用 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 已经足够快了。

关于c++ - 使二维数组中的所有元素在 C++ 中成为某个非零值的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35423152/

相关文章:

c++ - 类初始化时如何用非静态类函数初始化静态函数指针?

c++ - 从 ‘const int*’ 到 ‘int*’ 的无效转换

c++ - 用于映射一对一关系的 STL 类型?

c++ - boost::process 如何知道进程何时退出 "gracefully or not"?

c++ - 返回指针并传入 const 引用

c++ - 给定一些单词,找到一个序列,使得该序列的任何相邻单词都不能具有相同的字符

c++ - CUDA C++ 中的变量分配 - 无法分配设备变量

C++ 设计模式

c++ - 什么时候构造函数调用中的堆栈对象?

c++ - qt 图表删除标题/图例/的空间