vector和string的記憶體管理

2021-06-08 00:48:24 字數 1910 閱讀 6509

vector 和 string是stl中比較常用的容器,它們都能隨著資料的增加自動增加自身的容量。

vector是用動態陣列實現的,當vector沒有元素時,陣列大小為0,一旦vector中加入元素,加入元素後的總大小大於當前vector的容量時,vector會開闢一塊更大的空間,將原來的元素拷貝到新的空間,然後析構原來的元素,最後釋放原來所占用的空間。所以當不斷有元素加入到vector容器時,所花費的代價還是挺高的。幸好vector提供了乙個reserve函式可以將空間直接擴大到想要的空間的大小,避免多次開闢空間,拷貝元素,析構元素這些操作。

如果將vector容器的元素刪除一些,希望釋放多餘的空間,那怎麼辦呢。遺憾的是reserve函式只能增加容器的容量,而不能減少,當vector發現reverse的引數比容量小時,它什麼也不做,直接返回了。stl提供了swap方法來釋放vector多餘的空間,不過使用的時候不那麼明顯。swap的函式的本意是交換,即交換兩個容器的元素,我們可以通過宣告乙個臨時的vector容器,將vector容器的元素拷貝到臨時容器中去,然後將vector容器和臨時容器交換,由於臨時容器新增的元素是vector容器的元素,所以它不會有很多多餘的空間(這也和不同的stl實現廠家相關)。總之一句話,reserve函式可以增加vector容器的容量,swap函式可以減小vector容器容量。

string容器的記憶體管理情況和vector容器大致相同,只是有細微的差別。string也是根據元素的多少自動增加自身的容量,它也可以通過reserve函式直接增加容量。不同的是string通過reserver函式減少容量,而不是通過swap函式。我在redhat和suse上都嘗試過,他們的實現結果都是這樣的,我暫時還不清楚string的swap函式的實現為什麼沒有減少它的容量,如果讀者知道,請告訴我一下。

下面是我寫的測試vector和string的**,**在redhat 5 上可以通過編譯和執行,其中vector和string的容量增長是按2的倍數增長的,即每當容量超過是,容量加倍。

#include#include#includeusing namespace std;

typedef vectorintv;

void testvector()

intv.push_back(i);

}intv.clear();

intv.reserve(1000);

for(i = 0; i < 10; i++)

printf("size:%d, capacity:%d\n", intv.size(), intv.capacity());

intv.reserve(50);

printf("after reserve size:%d, capacity:%d\n", intv.size(), intv.capacity());

intv(intv).swap(intv);

printf("after swap size:%d, capacity:%d\n", intv.size(), intv.capacity());

}void teststring()

str += "0";

}str.clear();

str.reserve(1000);

for(i = 0; i < 10; i++)

printf("size:%d, capacity:%d\n", str.size(), str.capacity());

string(str).swap(str);

printf("after swap size:%d, capacity:%d\n", str.size(), str.capacity());

str.reserve(10);

printf("after reserve size:%d, capacity:%d\n", str.size(), str.capacity());

}int main()

vector內資料的深拷貝和淺拷貝

結論 vector內資料使用結構體的話是深拷貝,vector內的資料會拷貝乙份儲存,vector內資料不會丟失。如果vector內資料是指標的話是進行淺拷貝,資料超出作用域後會自動析構,vector內所指向的資料會被更改和丟失,所以vector如果作為全域性變數,不應該使用指標。include in...

關於字串string和vector的一些簡單處理

include include using namespace std int main cout include include using namespace std int main cout your hex number is result include include using na...

C 之 標準庫型別 Vector和String

本文對於標準庫型別string和vector的基本操作學習,比較簡單,key 行字串的獲取,string size type的使用,vector元素的插入,迭代器的使用 測試 include include include using std cin using std cout using std...