1. 程式人生 > >vector大小與容量的關係

vector大小與容量的關係

vector優異效能的祕訣之一,就是配置比其所容納的元素所需更多的記憶體。

vector中的函式capacity()返回vector實際能夠容納的元素數量,如果超出這個數量,vector就會重新配置內部儲存器。一旦記憶體重新分配,和vector相關的所有引用、迭代器、指標都會失效,而重新分配這些有很耗時間,所以如果需要速度的場景下,vector容量需要考慮。

可以使用reserve()來保留適當容量,避免重新分配。也可以在初始化期間向建構函式傳遞附加引數,構造足夠空間,但是如果型別本身很複雜,構造也會特別耗時間,所以如果只是保留記憶體,建議用reserve()。

如果呼叫reserve()所給引數比當前vector容量小,則不會有任何反應。

另外很多實現,就算你只插入1個元素,也會分配一段記憶體,如果大量vector只有零散元素,則會比較浪費記憶體。在VS2005下實驗以下程式碼,由此也可看出不同平臺有不同實現規律

std::vector<int> vec_int(1024);
int capa = vec_int.capacity(); // 1024
vec_int.push_back(1);
capa = vec_int.capacity(); //1536 增加了512個整型空間,2K位元組

std::vector<int> vec_int(128);
int capa = vec_int.capacity();//128
vec_int.push_back(1);
capa = vec_int.capacity();//192 增加64個整型空間

最後,vector迭代器持續有效,除非發生兩種情況:1、使用者在一個較少位置插入和移除元素;2、由於容量變化而重新分配記憶體。

​當然,刪除某個元素後,再使用原來的迭代器是危險的(在vs2005除錯版本會丟擲異常),需要避免這樣使用,應該使用erase返回的迭代器。還有,對於插入某個元素,更是有可能因重新分配空間導致迭代器等失效。