Vector差不多是我用得最多的容器,原因嘛当然办为他好用了,动态数组的感觉用起来很方便。
但这种方便是有代价的,不然为什么还需要定长数组呢。
Vector的动态增长需要重新分配内存,然后将原有数据move过去,这其中有对象的构造、析构等等,这是vector主要的效率损耗。(迭代器失效的锅,内存重新分配也要背,内存变了,所有指针相关的全部失效)
所以vector和数组扩张、容易减少相关的所有操作,都会经历重新分配内存和move数据的过程。
比如,pushback导致capacity变化(使超过现有的容量),或者resize导致capacity变化(仅限增加capacity的值)。
,
vector的扩张倍数为2,为什么不为1不为3?其实这一点没有标准,不过是不同的分配策略而已,扩张倍数为2,保证每次分配比前面的总和还大一点点,虽然前面分配的内存无法复用,但是因为更高的容量就更少的扩充。如果是2-1这一阶段,可以利用之前分配的内存,但是因为更少的容量,可能要更多的扩充。扩张耗时,分配内存耗空间。
这是一个空间消耗与时间消耗的问题。
这种对比,他们之前的差异是非常小的,扩充次数和浪费空间都是常数级。由于本来就没有标准,所以其实2或是1.5什么的实现都有,看谁实现的而已。
值得注意的一点是,vector的内存空间是只增不减的,所以如果erase了所有对象,要释放这些空间怎么做呢?vector提供了一个clear函数,清空了元素,但是size=0不代表capacity等于0,也就是说内存空间其实是没有释放的。
如果vector不能通过erase&