将double-all的二维数组设置为-1的最快方法
fastest way to set a 2-dim array of double all to -1?
将双精度的二维数组(如双精度x[N][N])设置为-1的最快方法是什么?
我尝试使用内存集,但失败了。有什么好主意吗?
使用来自algorithm
的:std::fill_n
std::fill_n(*array, sizeof(array) / sizeof (**array), -1 );
示例:
double array[10][10];
std::fill_n( *array, sizeof(array) / sizeof (**array), -1.0 );
//Display Matrix
for(auto i=0;i<10;i++)
{
for(auto j=0;j<10;j++)
cout<<array[i][j]<< " ";
cout<<endl;
}
一个简单的循环:
#include <stdio.h>
int main(void)
{
#define N 5
double x[N][N];
size_t i, n = sizeof(x) / sizeof(double);
for (i = 0; i < n; i++)
x[0][i] = -1.0;
for (i = 0; i < n; i++)
printf("%zu) %fn", i, x[0][i]);
}
// create constants
const int rows = 10;
const int columns = 10;
// declare a 2D array
double myArray [rows][columns];
// run a double loop to fill up the array
for (int i = 0; i < rows; i++)
for (int k = 0; k < columns; k++)
myArray[rows][columns] = -1.0;
// print out the results
for (int i = 0; i < rows; i++) {
for (int k = 0; k < columns; k++)
cout << myArray[rows][columns];
cout << endl;
}
您也可以直接设置
double x[4][4] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}
如果数组索引很小。
使用std::array
及其fill
方法:
#include <array>
#include <iostream>
int main()
{
const std::size_t N=4
std::array<double, N*N> arr; // better to keep the memory 1D and access 2D!
arr.fill(-1.);
for(auto element : arr)
std::cout << element << 'n';
}
使用C++容器,可以使用填充方法
array<array<double, 1024>, 1024> matrix;
matrix.fill(-1.0);
如果出于某种原因,必须坚持使用C样式数组,则可以手动初始化第一行,然后将memcpy初始化到其他行。无论您是将其定义为静态数组还是逐行分配,这都能起作用。
const int rows = 1024;
const int cols = 1024;
double matrix[rows][cols]
for ( int i=0; i<cols; ++i)
{
matrix[0][cols] = -1.0;
}
for ( int r=1; r<rows; ++r)
{
// use the previous row as source to have it cache friendly for large matrices
memcpy(&(void*)(matrix[row][0]), &(void*)(matrix[row-1][0]), cols*sizeof(double));
}
但我宁愿尝试从C风格的数组转移到C++容器,也不愿做那种噱头。
memset
,因为它基于void *
。所以中的所有字节都是相同的。(float)
-1
是0xbf800000
(double
0xbff0000000000000),因此并非所有字节都相同。。。
我会使用手动填充:
const int m = 1024;
const int n = 1024;
double arr[m][n];
for (size_t i = 0; i < m*n; i++)
arr[i] = -1;
矩阵就像内存中的数组,所以最好有1个循环,它稍微快一点。
或者你可以使用这个:std::fill_n(arr, m*n, -1);
不确定哪一个更快,但两者看起来相似。所以你可能需要做一个小测试来找到它,但据我所知,人们通常会使用一个或另一个。另一件事,第一件是一些编译器上的更多C
,它不起作用,第二件是真正的C++
,它永远不会在C
上起作用。所以你应该根据我认为的编程语言来选择:)
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- Poco 库 PUT 方法未按预期工作,尽管主机、方法、内容类型设置正确
- 如何在Visual Studio 2017上将类方法设置为参数并将它们与lambda一起使用?
- 将类方法设置为 OpenSSL 回调
- 哪个是设置位的最佳方法以及为什么?
- 设置窗口几何图形特性的正确方法
- 有没有一种方法可以在不设置精度的情况下设置小数位数
- 只设置一次方法中变量的值
- 将类方法设置为外部定义的函数
- 我如何调用我的3个数据成员中每个人的设置方法,然后显示由我的设置方法设置的值
- 使用其公共方法C 设置类的私人属性
- 位掩码:通过集合方法设置对象的不同状态
- 通过对象的指针数组分配内存,并使用方法设置它们的名称
- 设置为实例的静态值在从静态方法设置时有效,但不能从类内的静态方法设置
- 如何为静态模板方法设置别名
- 在qt单元测试中是否可以用单独的方法设置测试数据?
- 如何使用类方法设置单个类数组元素
- 使用私有方法设置类变量
- gdb-python编程:如何编写代码,为C++类的每个方法设置断点
- 从派生类方法设置基对象