STL容器vector、list和deque的區別

容器用得太頻繁了,就開始關注效率的問題,在某些地方開始尋求替代方案。最近常用的幾個容器就是vector、list和deque。

vector和數組類似,擁有連續的內存空間,其起始地址是固定不變的,因此能支持很好地隨機存取,也就是能像數組一樣通過[]來訪問其元素。vector使用動態數組的方式實現,其內部已經集成了內存管理功能(內部使用allocator類進行內存管理),包括內存的分配、釋放、自動回收等,因此,可以讓程序員把大部分精力放在業務本身,而不用過度關心內存管理方面的問題。

當使用insert或push_back爲vector對象增加元素時,如果動態數組的內存不夠用,就需要動態地重新分配內存,新分配的內存大小一般是當前大小的兩倍,然後把原數組的內容拷貝過去。所以,雖然vector有很好的隨機存儲性能,但在發生內存的重新分配時,其性能就會明顯下降。如果有大量的數據需要push back,應使用reserve()函數先設定其容量,避免許多次的容量擴充造成的效率低下。

list由雙向鏈表實現,它的內存可以是不連續的,只能通過指針來進行數據的訪問,因此它的隨機存取非常沒有效率,遍歷中間的元素時,搜索複雜度爲O(n),也沒有重載[]操作符。但由於鏈表的特點,list可以很好地支持任意地方的插入和刪除。

由於list內存不連續,因此其迭代器list::iterator也不支持“+”、“+=”、“<”等操作,只能通過“++”迭代。對比而言,vector::iterator則能很好地支持“+”、“+=”、“<”等操作符。

再來說說deque,deque是雙向隊列容器,其表面上與vector非常相似,在很多實際應用中也能直接替換vector。但deque提供在首尾兩端進行插入和刪除元素的操作,因此比vector多了push_front()和pop_front()兩個方法。deque使用一段一段的定量內存,在內存擴充時也只是加一段定量內存,由於其內存是分段連續的,因此對於insert操作來說,在不同段中的插入效率是相同的。而對於vector來說,插入的位置決定了執行的效率,插入的位置越靠前,效率越低。

下面列舉一下幾個容器在C++11中的成員函數,以供參考。

vector的成員函數:

list的成員函數:

deque的成員函數:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章