在STL 中 vector 和 list 的比較

STL的容器主要分爲兩大類:序列式容器(Sequence containers)和關聯式容器(Associative containers)。序列式容器主要包括 vector、deque、list;而關聯式容器包括set、multiset、map、multimap。這些容器都有許多相似的地方,但每個容器也都有自己的特點。首先分析一下vector、deque、list之間的相似與不同之處。

 

對於vector,可以看成一個動態的數組,可以通過迭代器隨機的存取,當往其插入新的元素時,如果在結尾插入,將會執行效率比較高,而如果往中間的某個位置插入,其插入位置之後的元素都要後移,因此效率就不是那麼的高。

對於deque它和vector特別的相似;它的元素也存在於動態數祖中,也支持隨機存取,和vector有幾乎一樣的接口。最大的不同之處就是,deque是雙向的。與vector相比(1)在首和尾插入和移動元素都特別的快。(2)對於元素的存取和迭代器的移動相對vector來說比較慢(這是由於deque內部的結構導致)。(3)deque中的迭代器(iterators)類似智能指針,而不同於普通的指針。(4)因爲可能用到了不止一塊內存( one block of memory),max_size()將比vector的max_size()大(5)不支持reallocation。(6)支持內存縮小,當某些內存塊不用時,將得到釋放。

 

在接口的實現上與vector幾乎一樣,只是少了capacity()與reserve()(原因上面已提到)而多了兩個push_front()、pop_frone()(因爲deque是雙向的)。

對於list可以將它的元素看成是方向鏈表。它和vector、deque有很大的不同。主要如下(1)它不能隨機存取,必須從頭一個一個遍歷。(2)插入和刪除任意位置都比較快,因爲僅僅是操作指針。(3)插入和刪除不會導致它的指針、引用、迭代器無效。(4)不能利用下表算符[]或者at()來存取元素(同(1))。(5)不支持capacity或者重新分配,因爲每個元素有自己的內存。(6)list自己提供了一些成員函數來支持元素的移動等,這些成員方法比<algorithm>中的同名方法有更高的效率。

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