C++學(xué)習(xí)筆記std::vector底層原理及擴(kuò)容
std::vector
std::vector
是C++標(biāo)準(zhǔn)庫中的一個容器,它提供了動態(tài)數(shù)組的功能。它的底層實現(xiàn)是通過連續(xù)的內(nèi)存塊來存儲元素,這使得它能夠在O(1)的時間復(fù)雜度下進(jìn)行隨機(jī)訪問。
當(dāng)創(chuàng)建一個std::vector
對象時,它會分配一塊初始大小的內(nèi)存空間來存儲元素。這個初始大小可以通過構(gòu)造函數(shù)的參數(shù)指定,如果沒有指定,默認(rèn)為0。std::vector
還會維護(hù)兩個重要的變量:size
和capacity
。size
表示當(dāng)前已存儲元素的數(shù)量,而capacity
表示當(dāng)前分配的內(nèi)存空間的大小。
當(dāng)我們向std::vector
中添加元素時,它會首先檢查是否有足夠的容量來存儲新的元素。如果當(dāng)前容量不足,std::vector
就需要進(jìn)行擴(kuò)容操作。
std::vector
的擴(kuò)容機(jī)制是通過重新分配內(nèi)存來實現(xiàn)的。當(dāng)容量不足時,std::vector
會分配一個更大的內(nèi)存塊,并將原來的元素復(fù)制到新的內(nèi)存中。通常,新的容量會比原來的容量大一些,以便減少頻繁的擴(kuò)容操作。具體來說,std::vector
通常會將容量擴(kuò)大為原來的兩倍,但這并不是絕對的,具體實現(xiàn)可能會有所不同。
在進(jìn)行內(nèi)存重新分配時,std::vector
會調(diào)用元素類型的拷貝構(gòu)造函數(shù)來復(fù)制元素。如果元素類型沒有提供拷貝構(gòu)造函數(shù),則無法使用std::vector
存儲該類型的對象。
一旦完成內(nèi)存的重新分配和元素的復(fù)制,std::vector
會釋放原來的內(nèi)存,并更新size
和capacity
的值。這樣,我們就可以繼續(xù)向std::vector
中添加新的元素了。
擴(kuò)容
下面是一個簡單的例子,演示了std::vector
的擴(kuò)容操作:
#include <iostream> #include <vector> int main() { std::vector<int> v; std::cout << "Capacity: " << v.capacity() << std::endl; // 輸出:Capacity: 0 for (int i = 0; i < 10; i++) { v.push_back(i); std::cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << std::endl; } return 0; }
需要注意的是,由于重新分配內(nèi)存和元素復(fù)制的開銷,std::vector
的擴(kuò)容操作可能會導(dǎo)致性能損失。因此,為了避免頻繁的擴(kuò)容操作,我們可以通過預(yù)先設(shè)置std::vector
的初始容量來提高性能。
總結(jié)
std::vector
的底層原理是通過連續(xù)的內(nèi)存塊來存儲元素,它的擴(kuò)容機(jī)制是通過重新分配內(nèi)存和元素復(fù)制來實現(xiàn)的。
以上就是C++學(xué)習(xí)筆記std::vector底層原理及擴(kuò)容的詳細(xì)內(nèi)容,更多關(guān)于C++ std::vector擴(kuò)容的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vs2019 MFC實現(xiàn)office界面的畫圖小項目
本文主要介紹了vs2019 MFC實現(xiàn)office界面的畫圖小項目,對大家入門有一定的幫助,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06學(xué)生成績管理系統(tǒng)C語言代碼實現(xiàn)
這篇文章主要為大家詳細(xì)介紹了C語言代碼實現(xiàn)學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01內(nèi)聯(lián)函數(shù)inline與宏定義深入解析
類的內(nèi)斂函數(shù)是一個真正的函數(shù)。使用內(nèi)聯(lián)函數(shù)inline可以完全取代表達(dá)式形式的宏定義2013-09-09