ACM學習歷程7 Vector向量容量擴充套件機制

2021-07-17 04:27:46 字數 1665 閱讀 8056

vector向量容器相當於乙個動態的陣列,當向向量容器中不斷加入元素,若超過容器本身的大小限制,

vector

會自動拓展大小,在這過程中涉及到記憶體的分配和**。在vector

中有size()

和capacity()

函式,與之相對應的兩個函式

resize(size_type)

和reserve(size_type)

。size函式是指返回當前容器中的元素個數,對應的resize(size_type)會在容器尾新增或刪除一些元素,來調整容器中實際的內容,使容器達到指定的大小。capacity指最少要多少元素才會使其容量重新分配,對應reserve(size_type new_size)會置這個capacity值,使它不小於所指定的new_size。有了這兩個函式,可以通過下面的**來測試一下,預設情況下vector的擴充套件機制是怎樣。

#include #include #include using namespace std;

int main()

} return 0;

}

執行的結果如下:

從第二例資料可以看出,預設情況下vector的擴充套件機制是按2倍拓展的也就是指數遞增。在整個大小拓展的過程中,主要的步驟如下:

(1)為需要的新容量分配足夠的記憶體; (2

)將元素從原來的記憶體拷貝到新記憶體中; (3

)銷毀原來記憶體中的元素; (4

)歸還原來的記憶體。   

如果元素的數目為n

,那麼我們知道步驟

(2)和

(3)都要占用

o(n)

的時間,除非分配或歸還記憶體的代價的增長超過

o(n)

,否則這兩步將在全部執行時間中占居支配地位。因此我們可以得出結論:無論用於重新分配的容量(

capacity

)是多少,重新分配乙個 大小(

size)為n

的vector

需要占用

o(n)

的時間。這個結論暗示了一種折衷權衡。假如在重新分配時請求大量的額外記憶體,那麼在相當長的時間內將無需再次進行重新分配,因此總體重新分配操作消耗的時間相對較少,這種策略的代價在於將會浪費大量的空間。另一方面,我們可以只請求一點點額外的記憶體,這麼做將會節約空間,但後繼的重新分配操作將會耗費時間。換句話說,我們面臨乙個經典的抉擇:拿時間換空間,或者拿空間換時間。當然在acm題目的解答過程中,一般會告知資料的範圍,這樣我們可以定義vector容器的大小,即使沒有告知資料量的大小,但是一定要避免陷入vector容器自增長造成記憶體空間的浪費。當然,當vector容量不夠用的時候我們可以根據需要定義需要拓展的大小。

#include #include using namespace std;

void showinfo(vector&v)

{ int i;

for(i=0;iv;

int i;

v.push_back(1);

v.push_back(2);

v.push_back(3);

v.push_back(4);

//此時v的實際大小

cout<

C 學習筆記7 vector容器

使用vector必須加上標頭檔案 include vector表示乙個型別相同的物件的集合,如 vector int i vector s vector 類名 d c 中既有類模板,也有函式模板,模板本身不是乙個類或者函式,更像是乙份說明,編譯器根據模板建立乙個類或者模板的過程稱為例項化。vecto...

ACM學習歷程8 Vector應用

vectors 包含著一系列連續儲存的元素 其行為和陣列類似。訪問 vector 中的任意元素或從末尾新增元素都可以在常量級時間複雜度內完成,而查詢特定值的元素所處的位置或是在 vector 中插入元素則是線性時間複雜度。應用舉例一 輸入資料 含有不多於50 個的正整數n 0 n 46 輸出數 對於...

ACM學習歷程6 Vector向量容器

vector向量容器屬於第一類容器,支援隨機訪問迭代器,與陣列不同的是,向量容器在記憶體用盡時,會自動分配更大的連續記憶體區,將原來的元素複製到性的記憶體區中,並釋放舊的記憶體區。vector 實際上相當於乙個動態的陣列,隨機訪問的時間為常數,在尾部新增速度很快,但是在中間插入元素時速度會變慢,這一...