C++ STL第三週筆記

1.容器deque
容器deque的實現原理:deque兩端都可以進出元素,而且它是“連續”存儲的,它的實現原理圖如下圖。可以看到deque由這幾部分構成:map(控制中心,實際上是vector類型),start(迭代器),finish(迭代器)。其中兩個迭代器中均包含四個元素:以start迭代器爲例。其中cur(指向當前元素的指針),first(指向這片緩存區的第一個緩存塊),last(指向這片緩存區的最後一個緩存塊),node(當前緩存區在控制中心的地址,也就是控制中心的首地址);deque容器不是真正意義上的連續存儲容器,map中的每一個元素都指向一個緩存區,每當deque進行++運算符操作時(以++爲例),deque會將迭代器中的cur和last相比較,不等就直接++,相等就進行判斷,先讓node指向下一塊緩存區,然後cur就指向下一個緩存區的第一個元素。

deque的insert()
當deque插入元素時,先判斷插入位置是否是deque的最前端或者最後端,如果是,直接用push_front()或者push_back()就可以;如果不是,先判斷插入點離前端比較近還是後端比較近,然後再進行插入;下面是實現代碼。


2.容器queue和satck

queue和stack都用deque或者list做底層,它們包含的元素就是deque或者list,然後使用它們的部分功能;它們都不支持遍歷;
queue不可以用vector做底層支撐,stack可以;
stack和queue都不可以選擇set或者map做底部支撐;


3.容器rb_tree

紅黑樹(Red Black Tree) 是一種自平衡二叉查找樹,是在計算機科學中用到的一種數據結構,典型的用途是實現關聯數組。紅黑樹和AVL樹類似,都是在進行插入和刪除操作時通過特定操作保持二叉查找樹的平衡,從而獲得較高的查找性能。它雖然是複雜的,但它的最壞情況運行時間也是非常良好的,並且在實踐中是高效的: 它可以在O(log n)時間內做查找,插入和刪除,這裏的n 是樹中元素的數目。

rb_tree提供“遍歷”操作以及iterator。
按照正常規則(++ite)遍歷,就能獲得排序狀態;

我們不應該適用rb_tree的iterator改變元素值,因爲元素有其嚴謹的排列規則,編程層面並未阻絕此事,因爲紅黑樹即將爲set和map服務;

如下圖是用於rb_tree的設計。




4.容器set/multiset
它們以紅黑樹爲底層結構,所以它們有元素自動排序的特性;
排序的依據是key,而set/multiset的元素的key和value合一;

set/multiset提供遍歷操作及iterator。按照正常規則遍歷,便能獲得排序狀態;

我們不能使用set/multiset的iterator改變容器中的值;

當set/multiset在使用iterator時,拿到的是rb_tree的iterator,而這iterator是const類型;

set的所有操作,都交給紅黑樹去做;

VC6不提供identify(),那麼set和map如何使用rb_tree?實際上VC6的set和map的紅黑樹中也有類似於identify的操作;



5.容器map和multimap
它們以紅黑樹爲底層結構,所以它們有元素自動排序的特性;
排序的依據是key,而map和multimap的元素有key和value;

set/multiset提供遍歷操作及iterator。按照正常規則遍歷,便能獲得排序狀態;

我們不能使用map和multimap的iterator改變容器中的key的值,但是可以改變data;
要做到這一點自動將user指定的key設爲const,而data爲non-const;

map獨特的operator[]:
Allows for easy lookup with the subscipt operator([])
returns data associated with thw key specified in subscript.
If the key dose not exist,a pair with that the key is created
using default values,which is then returned.

翻譯過來就是:如果找到就傳回來key對應的那個iterator,沒有找到就傳回最適合安插
那個key的iterator。


6.容器hashtable

散列表(Hash table,也叫哈希表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。  (百度百科)

給定表M,存在函數f(key),對任意給定的關鍵字值key,代入函數後若能得到包含該關鍵字的記錄在表中的地址,則稱表M爲哈希(Hash)表,函數f(key)爲哈希(Hash) 函數。

(百度百科)


下圖是哈希表的設計。其中HashFunc是爲了幫我們計算出元素位於哈希表中的編號。在使用hashtable時,需要自己寫一個hashfunc;
















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