博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多维数组浅谈
阅读量:6533 次
发布时间:2019-06-24

本文共 1090 字,大约阅读时间需要 3 分钟。

hot3.png

  C++中的多维数组并没有Java安全,也没它方便,依旧是C的遗风,快速但不安全,当然,可以使用STL的Vector来解决,但是在玩算法的时候这个就行不通了,成本太高,对于简单的代码片段而言,你不需要它的大多数特性。本人觉得,使用C风格的数组还是很有必要的,当然这个不太容易驾驭。

  这篇博文假设你已经了解并熟悉了C++的一维数组,以及动态分配。

一维静态数组形式如下:

type name[const];

  这只是一个声明式,并未初始化,也就是说数组各元素的值是不明确的,具体视编译器而言,在G++中默认为0,如果你想让你的代码具有可移植性,请不要利用这种默认值。

type name[size];

  不要奇怪,这在g++中是可以通过的,因为它是变长数组,但是vc6.0不可能通过编译的。

一维动态分配数组形式:

type* pStr = new type[size];

  对于一维数组而言,这些相当简单,但是针对多维数组呢?

int** pNumArr = new int[n][6];//很好,出错了

  为什么会出错呢?类型转换出错了,我们不能把int (*)[6]转换成int**,这个很明显,不是吗?

  正确形式应该是这样的:

int (*pNumArr)[6] = new int[n][6];

  是不是很恶心,我也这么认为。并且它的局限很大,你只能设置第二维,第一维依旧是const,也就是说无论是二维还是多维数组,采用这种形式,我们只能动态定义其最高维度,其它维度必须是const,没有意义啊。

  对此我们有如下解决方案:

上图是我们的解决方案的原理示意图。

  其实这个很简单

int** pNumArr = new int*[n];for(unsigned i = 0; i

  然后就是赋值了,对,就是用你最熟悉的双重循环,这个就不一一详述了。

  但是,这个完了吗?

  答案是肯定的,远远没有完,因为我们做了件相当过分的危险的事情,大量的使用new。你可能会使用如下代码,并鄙视我说这个很简单啊。

delete [] pNumArr;

  这个就是你的噩梦的开端,看看你造成了多少的内存泄漏。什么,无所谓?如果是n为上百万上千万时呢?

for(unsigned i=0; i

  至此也许你可以松一口气了,但是很遗憾的告诉你,这件事还没完。绝对不要忘了做下面这件事避免你的指针虚吊!

pNumArr = 0;

  至此,你可以放心的喝一口茶了。

 

转载于:https://my.oschina.net/codesun/blog/82424

你可能感兴趣的文章
C#中用ILMerge将所有引用的DLL打成一个DLL文件
查看>>
PHP生成HTML静态页面
查看>>
spring依赖注入和控制反转
查看>>
服务器启动django
查看>>
Makefile 中:= ?= += =的区别【转】
查看>>
使用makecontext实现用户线程【转】
查看>>
Comet:基于 HTTP 长连接的“服务器推”技术
查看>>
BZOJ 2733: [HNOI2012]永无乡 启发式合并treap
查看>>
四种方法校验数组中是否包含某个指定的字符串
查看>>
29、Java并发性和多线程-非阻塞算法
查看>>
安装OpenResty开发环境
查看>>
第0课 从0开始
查看>>
python class和class(object)用法区别
查看>>
hadoop无法启动DataNode问题
查看>>
java泛型中<?>和<T>区别
查看>>
这里是指推送通知跟NSNotification有区别:
查看>>
Linux中断(interrupt)子系统之一:中断系统基本原理【转】
查看>>
用户ID的代码生成
查看>>
win7经常出现“关闭xxxx前您必须关闭所有会话框”
查看>>
SNMP安全配置的两种方法(也可同一时候兼顾配置两种方法)
查看>>