<b>实现真正意义上的二维动态数组模板</b>[VC/C++编程]
本文“<b>实现真正意义上的二维动态数组模板</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
我们可以通过动态数组的反例来肯定动态数组应当具有哪些特点.大家都知道以下的方法是定义一个静态数组.
int iCount[10];
int iCount[10][10];
从上面可以看出,定义了静态数组之后,无论程序假如使这个数组,该数组在内存中所占空间的大小,位置是肯定不变的.
我们可以得出结论,关于编译器,静态数组的大小和空间是已知的,因此编译器可以自动为该数组分配空间.具体情形是:假如你定义了一个全局数组,编译器将在数据区为你的数组分配一个空间;假如是个部分数组(比方定义在某一个局数中),编译器为你的数组分配一个栈(Stack)空间.
从静态数组的谈论中我们得出动态数组应具有的特点:在程序的运行中,动态数组是大小应当是可变的.因些动态组数的实现应当是基于动态的分配内存底子上.下面看这个例子:
假定我们成立一个工厂工人的数据库,数据库中有多个表各代表差别的车间.每个表中保存该车间职工的信息,为了代码简单,可以只让数据库保存职工的姓名.
下面是一个InputWorkers函数,以车间为单位输入全车间职工姓名,然后一次性将这些数据存入数据库中.
void InputWorkers()
{
int iCountOfWorkers, int iNo;
……
用户输入得到车间的人数和车间号
……
string* iArray = new string[iCountOfWorkers];
……
用户输入车间全部职工的信息,并存在iArray数组中
……
StoreInDatabase(iArray, iNo ); //存入数据库
delete [] iArray;
}
在程序中iArray是个string指针,并非数组.但是数组的原理和指针是一样的,比方p[1]是指数组p中的第二个元素,但在实际寻址中是以p+1举行的.所以我们可以这样利用iArray[1].
InputWorkers中的iArray按照车间的总人数来分配差别大小的空间.从这种意义上,可以认为iArray实现了动态数组的功效.
假如iArray定义为一个静态数组,那么iArray的大小是固定的,因此我们必须预计车间人数的一个上限.
string iArray[100];
静态数组的速度是快于动态数组.因为从理论上,栈在速度上是快于堆的.但是我们假如断定利用动态数组在是因为节俭空间的考虑.别的要注意静态数组上限改变带来的本钱.我们必须重新设定上限以办理这个bug,然后重新编译程序.假如你能掌握程序的编译,这没问题.但是,你要做是的为每一个用户更新程序.没有更新的用户便可以碰到这个bug.想到这一点,你就欢愉不起来.
你大概会说,我设一下大一点的上限,超越它的大概性会非常小,并且内存的浪费也不会多大.比方最多一个车间200人,最少一个车间100人,那也只浪费了100空间.目前机械的内存根本不在乎这么一个空间浪费.是的,你可以这么做,但是请持续向下谈论.
目前我们要将全部职工的姓名存入一个二维数组,数组的每一行表示一个车间,每行中的元素是职工的姓名.想想看,假如用静态数组,你会浪费多空间.并且你还要为车间数加一个上限.这个例子并不好,因为工厂中的车间数应当是可以肯定的.但是我可以换个角度说,我只要某几个车间,也大概是全部车间,那么你能否还保持呢?
说了上面这些,只是极少的谈论了一下动态数组大概是利用情形.实际中,特别是大型软件系统中动态数组的利用其实很广泛.并且在C++的各种库中也有数组的实现的类,通过调用呼应的类函数便可以对数组中的元素实现增/删.并且也可以通过嵌套实现二维的动态.这些类或类模板利用起来很简单.比方:
CAtlArray<int> iArray;
iArray[0] = 1; // 出错,iArray中并没有元素
iArray.Add(1); // element 2
iArray[0] = 1; // 可以,iArray中并有1个元素
iArray[0] = 1; // 出错,iArray中并只有1个元素
以上是“<b>实现真正意义上的二维动态数组模板</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |