容器不是万能的!

之前一直被一句话误导了 “vector 和string优先于动态分配的数组。”,误以为vector比内置数组要好,其实应该是vector比动态分配的数组要好一些。最近遇到一个bug才认识到可能vector用起来确实方便些,但从效率和安全性来讲vector却不一定好。

例子:

在启动一个状态Status时,会遍历其中的效果Effect,逐个启动。当某个状态的某个效果是一个伤害,导致master死亡,部件被释放,该Effect启动之后返回到Status,继续遍历Effect时引起服务器崩溃,有时还报pure virtual function call。

出错代码:

 

如果用迭代器访问,当vector被清空,it永远不会到end。如果用数组和下标来访问,则可能避免这个问题。(这个例子中不行,因为释放了之后其他Effect开始时还是会出错,只能用其他方式避免,延迟之类的)

由于每个Status附带的Effect不是很多,用vector则至少初始化20个?有空间浪费。

 

可能这个例子不是很符合,主要想说明的是,容器用Iterator遍历时要十分小心检查有没有修改容器大小,比如常见的remove,push_back等可能要特殊处理,还有些隐蔽的如本例。

如果需要的数量或最大数量固定,有时候用数组比vector更合适。删除元素时将该位置置空,添加时找一个空位置,遍历时从0到最大值走一边,其实并不会比vector效率低。

 

顺便也看到了vector对于大量添加删除时的效率问题,当超过预分配空间时,vector从新分配2倍空间并逐一拷贝,拷贝的消耗可能很大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值