vector的操作和擴容

2021-09-25 20:17:04 字數 1582 閱讀 4014

vector是一段連續的記憶體空間。start,finish,end_of_storage三個指標描述了空間狀態,這三個是普通的指標。start到finish是已經使用的記憶體,裡面有元素。finish到end_of_storage是未使用的記憶體,裡面沒有元素。

vectorres(m);  //其空間capacity大小為m,但是沒有初始化其中的值,還沒有元素 size=0

vectorres(m, 0); //其空間(capacity)大小為m, 所有的值都為0,所有的資料型別都為int型別 size=m

還可以定義二維的vector

vector>res(m, vector(n, 0));  //相當於二位陣列,其大小為m*n,所有的值都為0
當然也可以不指定其大小,直接vectorres; 此時其size和capacity都為0。

問題為什麼要成倍的擴容而不是一次增加乙個固定大小的容量呢?為什麼是以兩倍的方式擴容呢??

答:成倍擴充套件是為了保證常數時間的複雜度,以2倍方式擴容是為了防止記憶體的浪費,更好的實現對記憶體的利用。

分析:

比較一下兩種方式的效率

以成倍方式增長  :

假定有 n 個元素,倍增因子為 m;

完成這 n 個元素往乙個 vector 中的 push_back​操作,需要重新分配記憶體的次數大約為 logm(n);

第 i 次重新分配將會導致複製 m^(i) (也就是當前的vector.size() 大小)個舊空間中元素;

n 次 push_back 操作所花費的時間復制度為o(n): 

m / (m - 1),這是乙個常量,均攤分析的方法可知,vector 中 push_back 操作的時間複雜度為常量時間.​

一次增加固定值大小

假定有 n 個元素,每次增加k個;

第i次增加複製的數量為為:100i

n 次 push_back 操作所花費的時間複雜度為o(n^2): 

均攤下來每次push_back 操作的時間複雜度為o(n);

對比可以發現採用採用成倍方式擴容,可以保證常數的時間複雜度,而增加指定大小的容量只能達到o(n)的時間複雜度,因此,使用成倍的方式擴容。

成倍擴容的知乎回答:

vector擴容原理說明

include include using namespace std int main system pause return 0 總結 對比可以發現採用採用成倍方式擴容,可以保證常數的時間複雜度,而增加指定大小的容量只能達到o n 的時間複雜度,因此,使用成倍的方式擴容。第二個問題 vector...

ArrayList和Vector擴容機制

直接給原始碼,jdk1.8 private void grow int mincapacity 可以看到,增長是1.5倍。首先來看個建構函式 下圖的建構函式我們可以看到,vector可以設定增長的值。public vector int initialcapacity,int capacityincr...

vector 1 5倍擴容優於2倍擴容的原因

假設我們一開始申請了 16byte 的空間。當需要更多空間的時候,將首先申請 32byte,然後釋放掉之前的 16byte。這釋放掉的16byte 的空間就閒置在了記憶體中。當還需要更多空間的時候,你將首先申請 64byte,然後釋放掉之前的 32byte。這將在記憶體中留下乙個48byte 的閒置...