24小时热门版块排行榜    

CyRhmU.jpeg
查看: 1404  |  回复: 19
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

lixy1217

木虫 (著名写手)

[交流] C++对高维数组有什么比较好的操作方式?已有2人参与

如题,所谓高维就是维数>3的情形。一般来说1维用一个指针,二维用两个指针,可维数一旦高了,例如10维的,在前面加10个 * 至少看着也不舒服吧~


而且如果要定义一个类,可以任意确定维数的,那么用加*的方式就更加没有办法应对了。当然可以换做链表的存储方式,但链表访问元素的计算耗时是不可忽略的。


另外有一个解决的方式,就是把所有的数值储存在一个数组中,再用一个长度等于维数的整数数组作为元素下标,调用元素时,只需要利用该下标的位置找到对应元素即可。可这样的话,需要消耗多少额外的计算量呢?


不知道除此之外还有什么更好的应对方式。
回复此楼
偶尔敞开心扉,世界将不再孤独
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lixy1217

木虫 (著名写手)

引用回帖:
6楼: Originally posted by dlmufei at 2015-09-15 00:47:57
所谓的高维数组只是表示形式,内存地址其实都是一维连续的,所以你最后一种方法可以通过指针首地址加上偏移量实现,缺点是你的自己计算多维到一维变换后的位置,为什么不直接使用多维访问,否则多维的意义何在?
...

多维主要是针对数学问题而言,而不是程序本身。不过看来用偏移量实现是求解高维(>3)问题最好的办法了,只有在程序设计的细节方面不断改进一下。
偶尔敞开心扉,世界将不再孤独
7楼2015-09-15 08:26:28
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lixy1217

木虫 (著名写手)

引用回帖:
4楼: Originally posted by zzy滴号 at 2015-09-14 23:04:02
如果不考虑效率的话,可以使用标准库中的vector来完成多维数组,其中可使用typedef来使代码更清晰。如下:
typedef std::vector<int> myVector1D ;
typedef std::vector<myVector1D> myVector2D;
ty ...

这应该是比较常规的方法吧。其实我更希望的是能把维数作为一个参变量的方式分离出来。也就是用一个类名表示任意维数,在类的成员中用一个专门的整型变量n表示对象对应的维数。
偶尔敞开心扉,世界将不再孤独
8楼2015-09-15 08:34:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lixy1217

木虫 (著名写手)

引用回帖:
3楼: Originally posted by charleslian at 2015-09-14 22:25:48
最后一个方法最好。不存在计算量的额外消耗,只是把高维数组的隐式存储变成显式的,对任意维度的数组只能这么做。只是会增加代码量,使程序不明晰。

看来只能这么做了~
偶尔敞开心扉,世界将不再孤独
9楼2015-09-15 08:36:41
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lixy1217

木虫 (著名写手)

引用回帖:
10楼: Originally posted by dk1013 at 2015-09-17 11:05:22
很好奇楼主是什么样的问题必须得用10维数组。

偏微分方程计算中,出现10个变量的函数并不奇怪
偶尔敞开心扉,世界将不再孤独
11楼2015-09-18 08:59:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lixy1217

木虫 (著名写手)

引用回帖:
12楼: Originally posted by wshwujian at 2016-02-08 21:16:08
声明10维数组的指针,怎么会加10个*呢?
四维数组:int a,该数组的指针声明为:int (*p);无论是直接使用,还是函数传参。p和数组名是一样的。使用p与*(*(*(*(P+j)+k)+l)+m)是一样的。都是通过地址访问数组啊 ...

这种定义范式太限制了吧?
因为后面的2、3、4都要求是固定数值
偶尔敞开心扉,世界将不再孤独
16楼2016-02-17 10:41:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lixy1217

木虫 (著名写手)

引用回帖:
17楼: Originally posted by 几罗星人 at 2016-02-24 01:16:12
动态高维数组可以用一位数组去模拟,就是动态分配足够大的一维数组,然后在上面模拟高维数组。就是你最后提出来的想法。
定义了数组:
        T MDA……
访问MDA……即取得其指针,由于数组在内存上是连续储存的 ...

这种方法的一个缺陷就是访问一个元素还得算好多次乘法,效率堪忧。
偶尔敞开心扉,世界将不再孤独
18楼2016-02-24 12:02:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 lixy1217 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见