当前位置: 首页 > news >正文

二维数组转一维数组提升效率方法

一.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 将不再包含有效的数据,因此不应再使用它。


http://www.mrgr.cn/news/68932.html

相关文章:

  • go语言中的接口含义和用法详解
  • ARM64环境使用docker-compose进行ElasticSearch8集群部署
  • 【RabbitMQ】07-业务幂等处理
  • Gitlab-执行器为Kubetnetes时的注意事项,解决DNS解析问题
  • 【flask开启进程,前端内容图片化并转pdf-会议签到补充】
  • QJson-趟过的各种坑(先坑后用法)
  • 网络安全技术及其在企业中的应用
  • CDMA(Code Division Multiple Access)
  • 数据分析主要干什么
  • IoTDB 与 HBase 对比详解:架构、功能与性能
  • 二叉树方面的题
  • 读数据工程之道:设计和构建健壮的数据系统32序列化和云网络
  • 一个灵活且功能强大的动画库 Popmotion
  • Redis集群模式之Redis Sentinel vs. Redis Cluster
  • java基础:反射
  • TCP(传输控制协议)和UDP(用户数据报协议)
  • 智能制造基础- TPM(全面生产维护)
  • Python酷库之旅-第三方库Pandas(203)
  • STL---迭代器
  • 出现 SLF4J: Class path contains multiple SLF4J bindings 原理分析
  • Java开发插件:JRebel热部署(最佳实践+激活方式)
  • 自动化测试工具Ranorex Studio(二十六)-对象库设置对话框
  • Spring框架之策略模式 (Strategy Pattern)
  • 二项堆 (Binomial Heap)、Fibonacci 堆详细解读
  • [数组排序] 0506. 相对名次
  • XML 现实案例:深入解析与应用