免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ywh147
打印 上一主题 下一主题

如何快速复制一个二维矩阵,要求时间上要快,可以暂不考虑空间问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-10-27 14:28 |只看该作者
原帖由 ywh147 于 2007-10-27 14:15 发表
newArray和 oldArray的声明为:int **newArray  和  int  **oldArray
分配空间的代码为
       oldArray=new int* [rowCount];
          for ( i=0;i


你现在只有采取你自己写的第二种方式了.
因为oldArray指向的是一个数组, 这个数组中的每个元素都为一个指针类型. 每个元素的指针所指向的地址不一定是连续的. 所以你只有一行一行的复制了.
这也是我为什么问你oldArray是怎么声明的原因.

论坛徽章:
0
12 [报告]
发表于 2007-10-27 15:01 |只看该作者
谢谢了 呵呵

论坛徽章:
0
13 [报告]
发表于 2007-10-27 18:49 |只看该作者
原帖由 ywh147 于 2007-10-26 22:15 发表
newArray和 oldArray的声明为:int **newArray  和  int  **oldArray
分配空间的代码为
       oldArray=new int* [rowCount];
          for ( i=0;i


分配连续内存,比如:

  1. oldArray = new int *[rowCount];
  2. oldArray[0] = new int[rowCount * colCount];
  3. for (int i = 1; i < rowCount; ++i)
  4.     oldArray[i] = oldArray[i-1] + colCount;
复制代码

就可以用上面整块memcpy的代码了。
memcpy(newArray[0], oldArray[0], rowCount * colCount * sizeof(int));

论坛徽章:
0
14 [报告]
发表于 2007-10-28 00:53 |只看该作者
你这矩阵的内部为啥非得用一个二维数组存储?
内部用一个数组,行主映射,封装下不得了,到时候直接copy一块数组就可以了

论坛徽章:
0
15 [报告]
发表于 2007-10-28 02:19 |只看该作者
原帖由 Solidus 于 2007-10-28 00:53 发表
你这矩阵的内部为啥非得用一个二维数组存储?
内部用一个数组,行主映射,封装下不得了,到时候直接copy一块数组就可以了


谢谢你的帮忙
但是什么是“行主映射”?我不太明白
用一维数组是可以,但是在用下标访问时就没那么方便了吧

论坛徽章:
0
16 [报告]
发表于 2007-10-28 02:36 |只看该作者
oldArray = new int *[rowCount];
oldArray[0] = new int[rowCount * colCount];
for (int i = 1; i < rowCount; ++i)
&nbsp;&nbsp;&nbsp;&nbsp;oldArray[i] = oldArray[i-1] + colCount;


这代码是什么意思啊我怎么没看明白呢,用oldArray[0]指向整个二维数组的内容那干嘛还要oldArray = new int *[rowCount];呢

论坛徽章:
0
17 [报告]
发表于 2007-10-28 02:57 |只看该作者
我明白上面那段代码是什么意思了,我晕,你太牛了呵呵,佩服啊

论坛徽章:
0
18 [报告]
发表于 2007-10-28 03:05 |只看该作者
oldArray = new int *[rowCount];
oldArray[0] = new int[rowCount * colCount];
for (int i = 1; i < rowCount; ++i)
&nbsp;&nbsp;&nbsp;&nbsp;oldArray[i] = oldArray[i-1] + colCount;


但是有个问题,用上面这种方法的话得多分配cowCount个空间,不考虑空间问题的话确实不错
你上面提到用一维数组然后封装,能不能讲具体点呢

论坛徽章:
0
19 [报告]
发表于 2007-10-28 09:55 |只看该作者
原帖由 ywh147 于 2007-10-28 02:19 发表


谢谢你的帮忙
但是什么是“行主映射”?我不太明白
用一维数组是可以,但是在用下标访问时就没那么方便了吧



行主
1 2 3
4 5 6
7 8 9

方便问题你可以封装下,例如 自由函数 + handle或者干脆C++。毕竟性能都成问题了就别考虑方便了,而且还是很方便的

论坛徽章:
0
20 [报告]
发表于 2007-10-28 19:48 |只看该作者
原帖由 emacsnw 于 2007-10-27 18:49 发表


分配连续内存,比如:

oldArray = new int *[rowCount];
oldArray[0] = new int[rowCount * colCount];
for (int i = 1; i < rowCount; ++i)
    oldArray = oldArray + colCount;

就可以用上面整 ...


利用的很好的前后连接指针是不是呢?
把oldArray[0]扩展到rowCount*colCount大小后
连接[1->rowCount]的oldArray[1->rowCount]头。。。。
保证连续空间分配了。。。。

不知道是不是这样的利用呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP