一.C语言中二维数组转一维数组
在数据量的情况下转换,不同转换方法效率差异还是很大的,尤其是在百万点以上的数据处理。
变量定义:
#define LEN_WIN 2000
#define LEN_VAR 10000
double pectrum_t[3e8];
double two_pectrum[2000][10000];
1.情况一
目的:把arry_pectrum内的数据按行存储到pectrum_t中。
for(int i=0;i<LEN_VAR;i++)
{
for(int j=0;j<LEN_WIN;j++)
{
pectrum_t[k] = two_pectrum[j][i];
}
}
说明:
由于是按行转换,这种方法无法用memcpy的内存拷贝,由于每个需要拷贝的变量内存都不连续,所以数据量大的时候非常耗时
2.情况二
目的:把arry_pectrum内的数据按列存储到pectrum_t中。
for(int i=0;i<LEN_WIN;i++)
{
for(int j=0;j<LEN_VAR;j++)
{
pectrum_t[k] = two_pectrum[i][j];
}
}
说明:
由于是按列转换,地址连续,拷贝速度比较快;还可以用memcpy的内存拷贝来改进,效率更高,如下:
for(int i=0;i<LEN_WIN;i++)
{
memcpy(pectrum_t+i*LEN_WIN, two_pectrum[i], LEN_VAR*sizeof(double));
}
3.实际编程中使用思路
有时候我们会获得情况一的two_pectrum,内存拷贝方法没法用,这时候很多转换是徒劳的,但可以跳出来想一下,把情况一种的two_pectrum通过程序变换行列顺序变换一下,就迎刃而解了。
二.c++中的拷贝效率改进
1.情况一
变量定义:
#include <QVector>
#include <cstring>
double pectrum_t[3e8];
QVector<double> newVector;
for (int i = 100; i <= 2000; ++i)
{
ewVector.append(pectrum_t[i]);
}
效率改进:
int size=2000-100;
newVector.resize(size);
std::memcpy(newVector.data(), pectrum_t + 100, (size) * sizeof(double));
2.情况二
(1)把newVector内的数据拷贝到gVector中
QVector<double> gVector;
QVector<double> newVector;
拷贝方式:
for(int i = 0; i < newVector.size(); i++)
{
gVector.append(newVector[i]);
}
改进方式(直接赋值即可):
gVector = newVector;
(2)移动用法:
gVector = std::move(newVector);
注意:使用移动赋值(C++11 及以上),移动赋值后,newVector 将不再包含有效的数据,因此不应再使用它。