1. 程式人生 > >STL 容器的概念

STL 容器的概念

tis 要求 因此 叠代器 經典的 優點 性能 multiset windows

STL 容器的概念

在實際的開發過程中,數據結構本身的重要性不會遜於操作於數據結構的算法的重要性,當程序中存在著對時間要求很高的部分時,數據結構的選擇就顯得更加重要。

經典的數據結構數量有限,但是我們常常重復著一些為了實現向量、鏈表等結構而編寫的代碼,這些代碼都十分相似,只是為了適應不同數據的變化而在 細節上有所出入。STL容器就為我們提供了這樣的方便,它允許我們重復利用已有的實現構造自己的特定類型下的數據結構,通過設置一些模版類,STL容器對 最常用的數據結構提供了支持,這些模板的參數允許我們指定容器中元素的數據類型,可以將我們許多重復而乏味的工作簡化

容器部分主要由頭文 件<vector>,<list>,<deque>,<set>,<map>,<stack> 和<queue>組成。對於常用的一些容器和容器適配器(可以看作由其它容器實現的容器),可以通過下表總結一下它們和相應頭文件的對應關系。

容器的概念

管理一組指定類型的元素。

技術分享

容器的分類


序列式容器

是一種線性結構,然後根據位置來存儲和訪問這些元素,這就是序列式容器。
Vector(向量)、deque(雙端隊列)、list(列表)

關聯式容器

是一種非線性的樹結構,和插入順序無關
通過鍵(key)來高效地查找和讀取元素
Set(集合)、multiset(多重結合)、map(映射)、multimap(多重映射)

容器適配器

容器適配器讓一種已存在的容器類型采用另一種不同的抽象類型的工作方式實現。
例如:stack(棧)適配器可使任何一種順序容器以棧的方式工作。
系統提供了三種序列式容器適配器:stack(棧)、queue(隊列)以及 priority_queue(優先級隊列)。所有的適配器都會在其基礎順序容器上定義一個新接口。

使用STL的好處

STL是C++的一部分,因此不用額外安裝什麼,它被內建在你的編譯器之內。 ?
STL的一個重要特點是數據結構和算法的分離。盡管這是個簡單的概念,但是這種分 離確實使得STL變得非常通用。例如,STL的sort()函數可以用來操作vector, list等容器。 ?
STL具有高可重用性,高性能,高移植性,跨平臺的優點。
高可重用性:STL中幾乎所有的代碼都采用了模板類和模版函數的方式實現,這 相比於傳統的由函數和類組成的庫來說提供了更好的代碼重用機會。
高性能:如map可以高效地從十萬條記錄裏面查找出指定的記錄,因為map是 采用紅黑樹的變體實現的。(紅黑樹是平橫二叉樹的一種)
高移植性:如在項目A上用STL編寫的模塊,可以直接移植到項目B上。
跨平臺:如用windows的Visual Studio編寫的代碼可以在Mac OS的XCode 上直接編譯。 ?
程序員可以不用思考STL具體的實現過程,只要能夠熟練使用STL就OK了。

了解到STL的這些好處,我們知道STL無疑是最值得C++程序員驕傲的一部分。每一個C++程序員都應該好好學習STL。只有能夠熟練使用STL的程序員,才是好的C++程序員。

標準容器類 特點

順序性容器

Vector(向量) 動態數組,從後面快速的插入與刪除,快速直接訪問任何元素
List(列表) 雙鏈表,從任何地方快速插入與刪除
Deque(雙端隊列) 從前面或後面快速的插入與刪除,快速直接訪問任何元素

關聯容器

Set(集合) 快速查找,不允許重復值 Multiset(多重集合) 快速查找,允許重復值
Map(映射) (key,value)基於關鍵字快速查找,不允許重復值
Multimap(多重映射) (key,value)基於關鍵字快速查找,允許重復值

容器適配器

Stack(棧) 後進先出
Queue(隊列) 先進先出
priority_queue (優先隊列) 最高優先級元素總是第一個出列

c++ 的vector、array和數組的比較

在c++11中,STL中提拱了一個新的容器std::array,該容器在某些程度上替代了之前版本的std::vector的使用,更可以替代之前的自建數組的使用。那針對這三種不同的使用方式,先簡單的做個比較:

相同點:
1. 三者均可以使用下表運算符對元素進行操作,即vector和array都針對下標運算符[]進行了重載
2. 三者在內存的方面都使用連續內存,即在vector和array的底層存儲結構均使用數組

不同點:
1. vector屬於變長容器,即可以根據數據的插入刪除重新構建容器容量;但array和數組屬於定長容量。
2. vector和array提供了更好的數據訪問機制,即可以使用front和back以及at訪問方式,使得訪問更加安全。而數組只能通過下標訪問,在程序的設計過程中,更容易引發訪問錯誤。
3. vector和array提供了更好的遍歷機制,即有正向叠代器和反向叠代器兩種
4. vector和array提供了size和判空的獲取機制,而數組只能通過遍歷或者通過額外的變量記錄數組的size
5. vector和array提供了兩個容器對象的內容交換,即swap的機制,而數組對於交換只能通過遍歷的方式,逐個元素交換的方式使用
6. array提供了初始化所有成員的方法fill
7. vector提供了可以動態插入和刪除元素的機制,而array和數組則無法做到,或者說array和數組需要完成該功能則需要自己實現完成
8. 由於vector的動態內存變化的機制,在插入和刪除時,需要考慮叠代的是否失效的問題。

基於上面的比較,在使用的過程中,可以將那些vector或者map當成數組使用的方式解放出來,可以直接使用array;也可以將普通使用數組但對自己使用的過程中的安全存在質疑的代碼用array解放出來。

STL 容器的概念