STL中vector的内存分配原则是分配为2倍的,为什么是2倍呢,让我们来分析一下。
其实分配内存就是在时间和空间上做一个平衡,如果每次增加的内存很少,那么在空间上浪费的就要少一点,但是时间耗费的要多。如果每次增加的内存很多,那么重新分配的次数就要少一点,时间耗费的也要少一点,但是浪费的空间就要多一点。可能有的人对空间浪费的说法不太清除,我在这里简单说明一下。假设每次增加内存时都以常数c增加,那么你最多浪费c-1个内存空间。假设每次重新分配时以2倍的策略分配,假设某个时刻vector的容量为n,那么当数据增加到n+1时,vector需要重新分配2n的空间,此时你浪费的空间就是n-1,随着分配的次数越多,浪费的空间也就越大。
当vector需要重新分配内存时,它要做以下几步:
(1)首先要分配一个新的内存
(2)把旧内存的数据拷贝到新内存中
(3)销毁旧内存中的数据
(4)释放旧内存
1.首先我们假设每次分配内存都以常数C为增量分配
设我们现在有nc个数据要放到vector中,假设vector初始容量为c,当vector的容量为2c时拷贝了c个数据到新内存中,vector的容量为3c时,要拷贝原来2c个数据到新内存中。依次类推,当vector的容量为nc时,一共拷贝了c+2c+.....+nc。假设拷贝一个数据的时间复杂度为常数,那么vector的容量增加到nc时需要的时间复杂度是O(n^2)。这种方法太耗时了。
2.假设我们每次分配都以倍数k来分配,然后我们再看一下情况会是