C++中vector是最常用的一個容器,本文參考《C++STL中文版》這本書中有關vector的章節,對vector容器的實現和應用做一些關鍵性的說明,便于讀者對vector進行更好的掌握和運用。
1 vector實現的關鍵點
(1)元素存儲空間的增長方式,建議使用參考書籍的增長方式,每次增長的空間至少是原來空間的一半,即N=(N+N/2),注意存儲空間利用率和當元素增長時程序的運行性能之間的平衡。
(2)實現時vector內的成員對象只有一個內存分配器對象和三個指向元素儲存空間的指針(First、Last和End)。
(3)vector的特例化模板vector<bool>的存在主要是對于bool類型的元素存儲和操作時在空間和時間上的優化。
(4)vector一般保留一個大小大于實際所需大小的數組空間,多余的存儲空間在成為有效數組的一部分前保持為未構造狀態。
(5)插入insert元素時需要移動元素的位置,移動時需要注意內存重疊,使元素的拷貝移動方向與元素的增長方向相反可解決內存重疊問題。
2 vector使用注意事項:
(1)max_size函數返回的是vector中的內存分配器allocator能夠分配的最大內存空間,即vector所能管控的最大序列長度,注意和capacity的區別。
(2)resize重新調整大小,既可以減小也可以增加size(數組的有效長度),但是內存并不一定減小。
(3)insert是在所指的元素之前進行插入,erase返回的迭代器指向被最后刪除的元素的下一個元素。
(4)注意插入和刪除元素后迭代器失效的問題。
(5)當預先知道所需的存儲空間時,可以使用reserve預先分配內存。
(6)vector對象作為一個高效的棧使用時,應該讓容器保持一定的預留存儲空間,頻繁的重新分配內存會影響棧的性能,可以使用reserve預分配內存,使用push_back、pop_back和back插入、刪除和讀取最后一個元素。
(7)clear只是保證了析構所有的元素,即size()=0,但并不保證釋放所有的存儲空間,即capacity不一定等于0,可以使用如下方式釋放所有內存:
vec.swap(vector<T>());
3 內存分配器allocator四個主要成員函數和功能簡介
(1)allocate:內存分配,僅分配內存,不構造對象。
(2)deallocate:內存釋放, 僅釋放內存,不析構對象。
(3)construct:在已分配的內存空間中構造對象,僅構造對象。不分配內存。
(4)destroy:在已分配的內存空間中析構已構造的對象,僅析構對象,不釋放內存。
(5)調用順序:allocate->construct->destroy->deallocate。
附圖片:vector insert函數實現關鍵點(內存空間的增長方式選擇)
http://img.blog.csdn.net/20170221171715448
新聞熱點
疑難解答
圖片精選