STL 學習資料

2021-05-26 12:25:23 字數 4316 閱讀 6101

收集的一些stl的學習資料:

什麼是stl?

stl(standard template library),即標準模板庫,是乙個具有工業強度的,高效的c++程式庫。它被容納於

c++標準程式庫(c++ standard library)中,是ansi/iso c++標準中最新的也是極具革命性的一部分。該庫

包含了諸多在電腦科學領域裡所常用的基本資料結構和基本演算法。為廣大c++程式設計師們提供了乙個可擴充套件的

應用框架,高度體現了軟體的可復用性。這種現象有些類似於microsoft visual c++中的mfc(microsoft 

foundation class library),或者是borland c++ builder中的vcl(visual component library),對於此二者,

大家一定不會陌生吧。

從邏輯層次來看,在stl中體現了泛型化程式設計的思想(generic programming),引入了諸多新的名詞,比

如像需求(requirements),概念(concept),模型(model),容器(container),演算法(algorithmn),迭

代子(iterator)等。與oop(object-oriented programming)中的多型(polymorphism)一樣,泛型也是一種

軟體的復用技術。

從實現層次看,整個stl是以一種型別引數化(type parameterized)的方式實現的,這種方式基於乙個在早先

c++標準中沒有出現的語言特性--模板(template)。如果查閱任何乙個版本的stl源**,你就會發現,模板

作為構成整個stl的基石是一件千真萬確的事情。除此之外,還有許多c++的新特性為stl的實現提供了方便。

1.stack,queue,priority_queue的相同點

之所以把stack,queue,priority_queue三者放在一起,是因為這三種容器再stl中均屬於特殊容器。他們都具有

如下特徵:

它們均是為滿足特定需求而建立的容器。stack是為了滿足filo,queue是為了滿足fifo,priority_queue則是

為了滿足優先順序高的元素先出佇列。

它們均具有一組含義非常明確的函式介面,比如stack的top,pop, push分別表示獲取棧頂元素,出棧和入棧,

queue的front,back, pop, push分別表示獲取佇列首元素,佇列尾元素,出佇列和入佇列。

它們均不是標準的stl容器,卻都是以標準stl容器為基礎。stack和queue預設是在deque的基礎上封裝的,

priority_queue預設是在vector的基礎上封裝出來的。stack和queue的基礎容器之所以選擇deque而不選擇vector

等容器,是因為deque在刪除元素的時候可以釋放空間,同時在重新申請空間的時候無需拷貝所有元素。

它們均對基礎容器有一定的要求,這個要求是由他們滿足的需求確定的。比如stack需要從棧頂進出元素和獲取

棧頂元素,它的基礎容器則需要提供back(), push_back(), pop_back()的函式。同理queue的基礎容器需要能夠

提供back(), push_back(), pop_front(), priority_queue的基礎容器需要提供back(), push_back(), pop_back()的函

數。你可以你的需要,通過引數傳遞修改它們的基礎容器。比如

stack> st

對於stack和queue還有乙個共同點,他們均有過載比較運算子,也就是說你可以對二個stack或者二個queue進

行字典許的比較和排序。

2.vector

向量相當於乙個陣列

在記憶體中分配一塊連續的記憶體空間進行儲存。支援不指定vector大小的儲存。stl內部實現時,首先分配乙個

非常大的記憶體空間預備進行儲存,即capacituy()函式返回的大小,當超過此分配的空間時再整體重新放分配

一塊記憶體儲存,這給人以vector可以不指定vector即乙個連續記憶體的大小的感覺。通常此預設的記憶體分配能完成

大部分情況下的儲存。

優點:(1) 不指定一塊記憶體大小的陣列的連續儲存,即可以像陣列一樣操作,但可以對此陣列

進行動態操作。通常體現在push_back() pop_back()

(2) 隨機訪問方便,即支援[ ]操作符和vector.at()

(3) 節省空間。

缺點:(1) 在內部進行插入刪除操作效率低。

(2) 只能在vector的最後進行push和pop,不能在vector的頭進行push和pop。

(3) 當動態新增的資料超過vector預設分配的大小時要進行整體的重新分配、拷貝與釋

3.list

雙向鍊錶

每乙個結點都包括乙個資訊快info、乙個前驅指標pre、乙個後驅指標post。可以不分配必須的記憶體大小方便的

進行新增和刪除操作。使用的是非連續的記憶體空間進行儲存。

優點:(1) 不使用連續記憶體完成動態操作。

(2) 在內部方便的進行插入和刪除操作

(3) 可在兩端進行push、pop

缺點:(1) 不能進行內部的隨機訪問,即不支援[ ]操作符和vector.at()

(2) 相對於verctor占用記憶體多

4.deque

雙端佇列 double-end queue

deque是在功能上合併了vector和list。

是一種具有佇列和棧的性質的資料結構。雙端佇列中的元素可以從兩端彈出,其限定插入和刪除操作在表的兩

端進行。雙端佇列是限定插入和刪除操作在表的兩端進行的線性表。這兩端分別稱做端點1和端點2。也可像棧

一樣,可以用乙個鐵道轉軌網路來比喻雙端佇列。在實際使用中,還可以有輸出受限的雙端佇列(即乙個端點

允許插入和刪除,另乙個端點只允許插入的雙端佇列)和輸入受限的雙端佇列(即乙個端點允許插入和刪除,

另乙個端點只允許刪除的雙端佇列)。而如果限定雙端佇列從某個端點插入的元素只能從該端點刪除,則該雙

端佇列就蛻變為兩個棧底相鄰的棧了。

儘管雙端佇列看起來似乎比棧和佇列更靈活,但實際上在應用程式中遠不及棧和佇列有用。

優點:(1) 隨機訪問方便,即支援[ ]操作符和vector.at()

(2) 在內部方便的進行插入和刪除操作

(3) 可在兩端進行push、pop

缺點:(1) 占用記憶體多

使用區別:

1 如果你需要高效的隨即訪問,而不在乎插入和刪除的效率,使用vector

2 如果你需要大量的插入和刪除,而不關心隨即訪問,則應使用list

3 如果你需要隨即訪問,而且關心兩端資料的插入和刪除,則應使用deque

5.map

map是stl的乙個關聯容器,它提供一對一(其中第乙個可以稱為關鍵字,每個關鍵字只能在map中出現一次

,第二個可能稱為該關鍵字的值)的資料處理能力,由於這個特性,它完成有可能在我們處理一對一資料的時

候,在程式設計上提供快速通道。這裡說下map內部資料的組織,map內部自建一顆紅黑樹(一種非嚴格意義上的平

衡二叉樹),這顆樹具有對資料自動排序的功能,所以在map內部所有的資料都是有序的,後邊我們會見識到有

序的好處。

下面舉例說明什麼是一對一的資料對映。比如乙個班級中,每個學生的學號跟他的姓名就存在著一一對映的關

系,這個模型用map可能輕易描述,很明顯學號用int描述,姓名用字串描述(本篇文章中不用char *來描述字

符串,而是採用stl中string來描述),下面給出map描述**:

mapmapstudent;

6.hash_map

set是stl中一種標準關聯容器(vector,list,string,deque都是序列容器,而set,multiset,map,multimap是標準

關聯容器),它底層使用平衡的搜尋樹——紅黑樹實現,插入刪除操作時僅僅需要指標操作節點即可完成,不

涉及到記憶體移動和拷貝,所以效率比較高。set,顧名思義是「集合」的意思,在set中元素都是唯一的,而且預設

情況下會對元素自動進行公升序排列,支援集合的交(set_intersection),差(set_difference) 並(set_union),對稱差

(set_symmetric_difference) 等一些集合上的操作,如果需要集合中的元素允許重複那麼可以使用multiset.

8.bitset

有些程式需要處理二進位制位的有序集,每個位可能包含0(關)值或1(開)值。位是用來儲存一組項或條件的yes/no資訊(又是也稱標誌)的簡潔方法。

STL學習小記

2009 05 09 17 04 387人閱讀收藏 舉報stl standard template libarary 主要提供了三類工具 容器container,迭代器iterato,演算法algorithm.stl提供了兩類容器 序列容器 以線性序列方式組織物件 關聯容器 用關聯的鍵把物件組織在一...

STL學習 容器

首先,明確的是,容器按照其內部的資料組織,分為關聯式和序列式 從上圖可以看到,heap內部含有乙個vector來實現底層儲存,priority queue又以heap為底層實現 stack和queue的實現都是依賴deque rb tree和hashtable是所有關聯式容器的底層資料結構。序列式容...

STL學習筆記

1.stl六大元件 1 容器 各種資料結構,如vector,list,deque,set,map,用來存放資料,從實現的角度看,stl容器是一種class template。2 演算法 各種常用的演算法如sort,search,copy,erase.從實現的角度看,stl演算法是一種function...