Vector的注意事項(大小與容量)
標準模板庫(STL)的所有容器中,Vector可以說是最容易上手、最容易理解的容器。不過,Vector也有好些值得我們注意的地方。
眾所周知,Vector是一個可以容納動態長度的容器。為了高效地運用Vector,應該瞭解Vector大小(size)和容量(capacity)的關係:Vector之中用於操作大小的函式有size()、empty()等,另一個與大小有關的函式是capacity(),它返回Vector實際能夠容納的元素數量。如果超出這個數量,Vector就有必要重新配置內部儲存器。
Vector的容量之所以重要,主要有兩個方面的原因:
1. 一旦記憶體重新配置,和Vector元素相關的所有reference、pointers、iterators都會失效;
2. 記憶體重新配置很耗時間。
當然,你可以通過使用reserve()函式預留相當大的容量,以避免一再重新配置記憶體。只要保留的容量足夠大,就不用擔心references等會失效。
std::vector<int> v;
v.reserve(100);
另一種避免重複配置記憶體的方法是:std::vector<T> v(5);不過這種方法,對基本型別效率和上一相似,如果元素型別是自定義的型別,此型別就必須提供一個default建構函式(自定義型別在初始化操作的時候很耗時, 不如reserve)。
幾點注意事項:
1. Vector的容量不會縮減,即使使用clear()函式,清空Vector的所有元素,Vector的真正佔用記憶體不會減少。不過有一個縮減Vector容量的小竅門:兩個Vector交換內容後,兩者的容量也會互換。現有Vector V;
std::vector<int> tmp;
V.swap(tmp); // 這樣tmp就和V交換了容量
或者:
V.swap(std::vector<int>() ); // 和一個臨時Vector交換
2. 慎用Vector:Vector本身就佔用一定的記憶體,即使不向其中新增任何元素。
std::vector<int> tmp;
int a = sizeof(tmp); // 可以看到a的值為20(當然這個值根據不同的系統與環境有關,我的VS2008+win7)
甚至,在許多實作方案中,容量的增長幅度比我們料想的還大。事實上為了防止記憶體破碎,在許多實作方案中即使不呼叫reserve(),當第一插入元素時也會一口氣配置整塊記憶體(如2K)。如果有一大堆Vectors,每個Vector的實作元素卻寥寥無幾,那麼浪費的記憶體會相當可觀。切記!!慎用Vector