设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 1148|回复: 5
打印 上一主题 下一主题

关于动态数组的产生方法

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-3 01:56:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
还得麻烦大家帮帮忙

我一直在考虑红警中造兵的得原理,我说一说看对不对,根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操作符可以动态申请内存,那么如何在我开始定义数组的时候控制系统不分配内存呢?
在造兵的相应中控制内存的分配,请高手指教
2#
发表于 2009-11-3 01:56:31 | 只看该作者
用一个指针,然后就对该指针进行动态分配,不可以吗?(我没做过这个程序)
CFighter * pCFighter = new CFighter[n];
...
delete []pCFighter;
回复 支持 反对

使用道具 举报

3#
发表于 2009-11-3 01:56:33 | 只看该作者
比如你开始可以定义一个较小的内存分配:
比如,const int first = 10;//初始容量大小的值
CFighter * pCFighter1 = new CFighter[first];(这里把他做缓冲用)
当你快要到达first边界的时候,可以分配另外一个动态数组,是起两倍大小:CFighter * pCFighter2 = new CFighter[first*2];然后把pCFighter1的内容 深拷贝 给pCFighter2。然后first*=2;这样就可以再下一次又循环这样的操作,最后delete [] pCFighter1;就有了另外一个新的动态内存了。
注:翻倍增加动态内存中的倍数可以自己控制,根据自己的情况。
如果按照每创建一个新兵,就将内存重新分配,加一个1,这样会使操作次数太多,减少运行效率。

如果说错哪里,被高手看到,一定指出,我怕误入歧途。
回复 支持 反对

使用道具 举报

4#
发表于 2009-11-3 01:56:34 | 只看该作者
谢谢,我试试
回复 支持 反对

使用道具 举报

5#
发表于 2009-11-3 01:56:35 | 只看该作者
为什么不用链表实现呢
每次产生一个新兵时 用CFighter * pCFighter1 = new CFighter;
产生一个指向新兵的指针,然后将其加入链表中,这样速度不会很慢,但
很节省内存
回复 支持 反对

使用道具 举报

6#
发表于 2009-11-3 01:56:38 | 只看该作者
好象用容器也不错,直接在每次创建一个新兵,就直接push_back();这样也可以达到效果
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-18 03:35 , Processed in 0.101663 second(s), 9 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表