新微赢技术网

标题: 关于动态数组的产生方法 [打印本页]

作者: 寂寞男孩    时间: 2009-11-3 01:56
标题: 关于动态数组的产生方法
还得麻烦大家帮帮忙

我一直在考虑红警中造兵的得原理,我说一说看对不对,根dx8无关,请指教

作一个类CFighter,在程序开始前声明一个该类的指针数组,数组的容量是造兵数的上限。如:
CFighter MyFighter[100];

在响应用户“造兵”动作时,根据用户的选择对CFighter的对象赋值,并累加已造兵数 如:
SumFighter++;
MyFighter[SumFighter].Blood=100;
MyFighter[SumFighter].Speed=10
....................
这样一个新兵就产生了;
在主循环函数中,
for (i=0;i<SumFighter;i++)
{
.......
//显示士兵MyFighter[i]的位置、状态等

}
但是有一个问题就是我的CFighter 如果很大,申请一个100各成员的数组会占很大内存,
在用户制造几个兵的情况下,就导致系统资源的浪费,更何况红警可以造几千个兵。
我看到很多时候用new操作符可以动态申请内存,那么如何在我开始定义数组的时候控制系统不分配内存呢?
在造兵的相应中控制内存的分配,请高手指教
作者: 龍2132    时间: 2009-11-3 01:56
用一个指针,然后就对该指针进行动态分配,不可以吗?(我没做过这个程序)
CFighter * pCFighter = new CFighter[n];
...
delete []pCFighter;
作者: 女装批发3    时间: 2009-11-3 01:56
比如你开始可以定义一个较小的内存分配:
比如,const int first = 10;//初始容量大小的值
CFighter * pCFighter1 = new CFighter[first];(这里把他做缓冲用)
当你快要到达first边界的时候,可以分配另外一个动态数组,是起两倍大小:CFighter * pCFighter2 = new CFighter[first*2];然后把pCFighter1的内容 深拷贝 给pCFighter2。然后first*=2;这样就可以再下一次又循环这样的操作,最后delete [] pCFighter1;就有了另外一个新的动态内存了。
注:翻倍增加动态内存中的倍数可以自己控制,根据自己的情况。
如果按照每创建一个新兵,就将内存重新分配,加一个1,这样会使操作次数太多,减少运行效率。

如果说错哪里,被高手看到,一定指出,我怕误入歧途。
作者: ═━灆涩━═    时间: 2009-11-3 01:56
谢谢,我试试
作者: 大漠    时间: 2009-11-3 01:56
为什么不用链表实现呢
每次产生一个新兵时 用CFighter * pCFighter1 = new CFighter;
产生一个指向新兵的指针,然后将其加入链表中,这样速度不会很慢,但
很节省内存
作者: 夜来香    时间: 2009-11-3 01:56
好象用容器也不错,直接在每次创建一个新兵,就直接push_back();这样也可以达到效果




欢迎光临 新微赢技术网 (http://bbs.weiying.cn/) Powered by Discuz! X3.2