跳到主要内容

简述vector 的增加删除都是怎么做的?为什么是 1.5 倍 ?

参考答案:

Vector在C++标准模板库(STL)中是一种动态数组,它可以自动调整大小以适应新的元素。增加和删除元素时,Vector会进行相应的操作来保持其连续的内存布局。

  1. 增加元素:

    • 当向Vector中添加元素时,如果当前的Vector容量不足以容纳新元素,它会发生扩容。扩容的大小通常是原容量的1.5倍或2倍(具体倍数取决于编译器实现)。
    • 扩容后,Vector会分配一个新的内存块,其大小足以容纳所有现有元素和新元素。然后,Vector会将现有元素从旧内存块复制到新内存块,并释放旧内存块。
    • 最后,Vector会将新元素添加到新内存块的末尾。
  2. 删除元素:

    • 当从Vector中删除元素时,Vector实际上并不会立即释放内存。相反,它会将删除位置的元素标记为“已删除”,并将该位置之后的所有元素向前移动一位。
    • 这样做的目的是为了保持Vector的连续内存布局,并减少内存分配和释放的次数。

为什么是1.5倍?

选择1.5倍作为扩容的倍数是一个权衡空间和时间复杂度的策略。如果扩容倍数太大,比如2倍或更多,虽然可以减少扩容的次数,但会导致更多的内存浪费。因为每次扩容后,Vector都会保留一部分未使用的内存。如果扩容倍数太小,比如1.1倍或更少,虽然可以减少内存浪费,但会增加扩容的次数,从而增加内存分配和释放的开销。

1.5倍作为一个中间值,可以在一定程度上减少内存浪费和扩容次数,从而实现较好的空间和时间复杂度权衡。当然,具体的扩容倍数可能会根据不同的编译器和平台进行优化调整。