之前一直被一句话误导了 “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倍空间并逐一拷贝,拷贝的消耗可能很大。