在 C 语言里面,不规则的二维数组有什么比较方便高校的复制方法吗?

2020-04-16 10:56:59 +08:00
 Kellerman

就像标题说的,我现在需要将数组从一个不规则的二维数组中复制到另外一个二维数组中,这两个二维数组都是不规则的,而且结构是不一样的,只是所能容纳元素的总长度相等,这种问题,有什么高效的方法吗?谢谢大家了!

3058 次点击
所在节点    程序员
32 条回复
InkStone
2020-04-16 10:59:01 +08:00
我觉得最大的问题是,两个数组的结构都不一样,你想怎么复制?

如果只是按内存地址顺序复制,那直接 memcpy 就好了。
across
2020-04-16 11:03:52 +08:00
不能。
不过一开始就自己 malloc 一块区域,手动控制对象,效率会好点吧。
jngke931126
2020-04-16 11:11:25 +08:00
很好奇这个的应用场景,能说下不,也许有别的办法呢
linvon
2020-04-16 11:45:33 +08:00
只能自己操作内存了吧
Kellerman
2020-04-16 12:22:42 +08:00
@InkStone 那如果说 我是从 n 段不等长的连续内存,复制到 m 段不等长的内存里,有没有比较方便的方法。(段内存内部是连续的,段与段之间是不连续的!)
Kellerman
2020-04-16 12:23:04 +08:00
@across 能具体讲讲吗,我的应用场景是,是从 n 段不等长的连续内存,复制到 m 段不等长的内存里,有没有比较方便的方法。(段内存内部是连续的,段与段之间是不连续的!
Kellerman
2020-04-16 12:23:21 +08:00
@jngke931126 我是从 n 段不等长的连续内存,复制到 m 段不等长的内存里,有没有比较方便的方法。(段内存内部是连续的,段与段之间是不连续的! 这是应用场景!
Kellerman
2020-04-16 12:23:32 +08:00
@linvon 自己操作内存这个能详细说下吗?
xpfd
2020-04-16 12:31:01 +08:00
自己写个函数,针对每段数据,单独 memcpy
Kellerman
2020-04-16 12:35:51 +08:00
@xpfd 那这样的我要比对每一段源和目的内存的长度,然后分情况讨论,这样就会显的非常复杂,有什么更简单的方法吗?
linvon
2020-04-16 13:02:39 +08:00
@Kellerman 手动根据长度自行 memcpy 呗,你要是嫌双判断麻烦,就先把 n 段先拿出来存放成线性的 x,再把 x 根据 m 段的长度拆解进去
zhyl
2020-04-16 13:11:44 +08:00
数组存储空间连续, 直接当成内存空间使用 memcpy 拷贝就行了
across
2020-04-16 13:15:06 +08:00
@Kellerman 仅在拷贝时解决不了,要在更高层面优化,不如查查稀疏数组( Sparse Array )管理方法。
zhyl
2020-04-16 13:15:38 +08:00
结构不一样不影响拷贝, 只影响你怎么去解释这个数组

举个例子: 一个 int 数组拷贝到一个 char 数组中, 两个数组的基本元素结构并不一样, int 占 4 字节(假设), char 占 1 字节, 这个结构只影响你后续怎么使用这个数组, 但是拷贝的话是不看结构的, memcpy 前两个参数为 void* 就应该明白这一点
InkStone
2020-04-16 13:31:48 +08:00
@Kellerman 没看明白你的意思。

n 段内存复制到 m 段内存,n≠m 的时候怎么做映射?
假设 n 段内存的长度为 n1,n2,n3,n4,n5,m 段内存的长度为 m1,m2,m3,m4,m5,n1 要复制到 m1, n1>m1 怎么办,n1<m1 又怎么填充?

你最好不要描述得那么抽象,直接把你想解决的问题说出来给大家听听。
zjsxwc
2020-04-16 13:37:33 +08:00
对不起我看不懂题目
xdtr
2020-04-16 13:39:00 +08:00
根据数组 a 的所有数据长度 malloc 一片内存 m,把数组 a 的所有数据按顺序存放到 m 中,然后根据数组 b 的每一段长度从 m 中取出对应的长度存放到 b 中。
wutiantong
2020-04-16 13:53:45 +08:00
not a good question

我建议对问题做进一步补充:
既然要问的是有什么“高效的”方法,那不妨贴一段代码来展示作为 baseline 的实现。
pkookp8
2020-04-16 14:06:59 +08:00
@InkStone 可能问题中 n 和 m 长度虽然不等,但总长 m 大于等于 n
例如 2 段内存,一段 4 字节一段 20 字节
按序拷贝到
3 段内存,一段 8 字节一段 12 字节一段 4 字节

我觉得没办法吧,就是比较长短。短的部分直接拷贝,拷贝后长的部分减去相应长度,继续下一次拷贝
oahebky
2020-04-16 15:09:25 +08:00
直接复制很低效吗???

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/662999

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX