STL學習 容器

2021-06-22 22:53:46 字數 1442 閱讀 2124

首先,明確的是,容器按照其內部的資料組織,分為關聯式和序列式

從上圖可以看到,heap內部含有乙個vector來實現底層儲存,priority_queue又以heap為底層實現;stack和queue的實現都是依賴deque;rb-tree和hashtable是所有關聯式容器的底層資料結構。

序列式容器:

1.vector內部維護的是乙個連續的線性空間,對於迭代器即是以普通指標實現,具有隨機訪問的能力

插入會引起vector內部空間的重新配置,對於erase(iterator position)的實現,需要將p後面的所有元素遷移乙個單位:copy(position+1, finish, position)

2.list是乙個雙向的鍊錶,對於list的迭代器實現來說,不能以普通指標,以為指向的節點不連續,迭代器需要可以正確的在節點之間移動,list的迭代器在插入和接合操作時都不是失效,這點與vector不同

sgi的list是乙個雙端環形的鍊錶,尾端存在乙個空節點

3.deque是雙向開口的連續空間容器,vector是單向的,意味著deque在頭部的插入和刪除操作要遠遠好於vector,deque的迭代器同樣不是普通指標,因為deque的實際儲存空間並不完全連續,刪除元素時可能會造成緩衝區的釋放:

4.stack和queue

以deque封閉頭部,即可實現stack,stack不提供迭代器,同樣封閉deque的尾端的出口和前端的入口,即可實現queue,queue同樣不提供迭代器,無迭代器意味著不能對容器進行遍歷操作。

5.heap

heap不屬於stl容器的一部分,heap是以演算法的形式作用於vector上,為priority_queue提供了實現。heap是一顆完全二叉樹

注意的是,陣列的第乙個下標0處被設定了乙個無效標識,意味著對於乙個i處的節點,2i和2i+1是它的左右孩子,父節點是i/2,有的資料結構書籍裡沒有這個標識,那麼相應的左右孩子變化為2i+1和2i+2,父節點為(i-1)/2

heap實現了push_heap(sift up操作),pop_heap(sift down),sort_heap(sift down),make_heap(sift down)用於在vector上建立,排序,插入,刪除元素

heap同樣沒有迭代器,不提供遍歷操作

6.priority_queue

以乙個max heap實現,無迭代器

7.slist

slist插入效率比較低,需要從頭開始查詢需要插入的位置,所以只提供了push_front()操作,迭代器是單向迭代器

關聯式容器:

關聯式容器沒有頭尾的概念,所以沒有push_back,push_front,pop_back, pop_front等類似的操作,關聯式容器的底層一般以紅黑樹rb-tree實現,同時非標準裡也包含了以雜湊hash實現的關聯式容器

STL學習 順序容器

我以 vector 為例,總結一下 stl順序容器的基本使用。vector 是順序容器,它在很多方面類似於我們通常使用的陣列。但是它比陣列具有很多很好的特性。它使用安全,具有陣列所不具備的自增長的特性,使得 vector 在現代軟體設計中佔據重要地位。本講分五個部分,分別是初始化 迭代器 容器訪問 ...

stl容器學習目錄

vector和list的比較熟悉,乙個單鏈表,乙個雙鏈表 push pack,insert,erase,list的sort功能 great 還有演算法那個庫 slist,只能用pushfront 三 deque容器 雙端佇列 說明 include deque容器類與vector類似,支援隨機訪問和快...

C 學習 STL容器

vector 向量 線性容器 用標準模板,記得加上相應的標頭檔案 include include using namespace std int main 設定向量容量 初始化 v1 0 8 v1 1 8 v1 2 8 宣告迭代器 標準他屬於那個模板 vector iterator v1 iter ...