vector - 會自動增長的陣列
list - 擅長插入刪除的鍊錶
有黑必有白,世界萬物都是成對出現的。
鍊錶對於陣列來說就是相反的存在。
陣列本身是沒有動態增長能力的(程式中也必須重新開闢記憶體來實現),
而鍊錶強悍的就是動態增長和刪除的能力。
但對於陣列強悍的隨機訪問能力來說的話,鍊錶卻很弱。
list是乙個雙向鍊錶的實現。
為了提供雙向遍歷的能力,list要比一般的資料單元多出兩個指向前後的指標。
這也是沒辦法的,畢竟現在的pc記憶體結構就是乙個大陣列,
鍊錶要在不同的環境中實現自己的功能就需要花更多空間。
list提供了push_back,push_front,pop_back,pop_front四個方法
來方便操作list的兩端資料的增加和刪除,不過少了vector的at和運算子的
隨機訪問資料的方法。並不是不能實現,而是list的設計者
並不想讓list去做那些事情,因為他們會做得非常差勁。
對於list來說,清除容器內所有的元素是一件苦力活,
因為所有資料單元的記憶體都不連續,list只有乙個乙個遍歷來刪除。
deque - 擁有vector和list兩者優點的雙端佇列
黑與白,處於這兩個極端之間的就是令人愉悅的彩色了。
deque作為vector和list的結合體,確實有著不凡的實力。
stl的deque的實現沒有怎麼去看過,不過根據我自己的猜測,
應該是把陣列分段化,在分段的陣列上新增指標來把所有段連在一起,
最終成為乙個大的陣列。
deque和list一樣,提供了push_back,push_front,
pop_back,pop_front四個方法。可以想象,如果要對deque的兩端進行操作,
也就是要對第一段和最後一段的定長陣列進行重新分配記憶體區,
由於分過段的陣列很小,重新分配的開銷也就不會很大。
deque也和vector一樣,提供了at和運算子的方法。
要計算出某個資料的位址的話,雖然要比vector麻煩一點,
但效率要比list高多了。
首先和list一樣進行遍歷,每次遍歷的時候累積每段陣列的大小,
當遍歷到某個段,而且basen <= index < basen + basen_length的時候,
通過address = basen + basen_index就能計算出位址
由於分過段的後鍊錶的長度也不是很長,所以遍歷對於
整體效能的影響就微乎其微了。
看起來deque很無敵吧,不過deque和希臘神話的阿吉里斯一樣,
再怎麼強大也是有自己的弱點的,之後的測試資料中就能看到了。
STL讀書筆記 迭代器概念
一。概念 1 迭代器在設計模式中成為iterator模式,其定義為 提供一種方法,使他能夠按順序遍歷某個聚合體 容器 所包含的所有元素,但又不需要暴露該容器的內部表現方式。2 迭代器是一種類似指標的物件,他的工作也主要是內容提取 dereference 和成員的訪問 member access 因此...
STL原始碼剖析讀書筆記
一.stl提供六大元件,彼此可以組合套用。1.容器 containers 各種儲存結構,如vector list deque set map,用來存放資料。2.演算法 algorithme 各種常用演算法,如sort search copy erase等。3.迭代器 iterators 扮演容器與演...
STL讀書筆記 迭代器概念
一。概念 1 迭代器在設計模式中成為iterator模式,其定義為 提供一種方法,使他能夠按順序遍歷某個聚合體 容器 所包含的所有元素,但又不需要暴露該容器的內部表現方式。2 迭代器是一種類似指標的物件,他的工作也主要是內容提取 dereference 和成員的訪問 member access 因此...