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...