標準模板庫,是一組模板類和函數,向程式員提供了 : 儲存資訊的容器 訪問儲存資訊的迭代器 操作容器內容的演算法
簡單的來說,就是分為三部分,演算法,迭代器,容器,其中迭代器是演算法和容器之間的橋樑,可以讓程式員可以通過演算法對容器進行操作,而且這些演算法也不是容器相關的,比如說reverse演算法,對於多個容器都可以使用。本篇主要簡單的介紹一下標準模板庫(不包括C++11標準),如果想要系統的學習,還是需要去看相關書籍。 STL容器
容器是用於儲存資料的STL類,容器大概分為2種: 順序容器 關聯容器
順序容器:指的是容器內的資料是按照順序儲存的。順序容器的插入速度較快,但是尋找速度較慢。
順序容器有:vector,deque,list
關聯容器:指的是容器內的資料是按照索引值對來儲存的,或者說是指定的順序來儲存的,就像字典一樣,關聯容器的特點是,插入速度慢,但是讀取速度快。
關聯容器有:set,map,multiset,multimap
有些STL實現也支援hash_set,hash_multiset,hash_map,hash_multimap。這些容器有更好的搜尋效能,搜尋所需要的時間和容器的大小無關。但是,這些容器並不是遵循標準的容器,如果想要應用程式在不同的平台之間能夠移植,還是需要遵循標準的容器。
string雖然操作和容器十分相似,但是由於string不能存取任意的資料類型,所以嚴格來說,還不能被稱為容器。 選擇正確的容器
| 容器 |
類型 |
優點 |
缺點 |
| std::vector |
順序容器 |
在末尾插入資料快 可以像訪問數組一樣訪問 |
調整大小時將影響效能 搜尋時間與容器大小成正比 只能在末尾插入資料 |
| std::deque |
順序容器 |
具備vector的所有優點 還可以在頭部插入資料 插入時間也是固定的 |
有vector的所有缺點 但與vector不同的是,根據規範,deque不需要支援reverse()函數。 |
| std::list |
順序容器 |
在list中間,開頭,結尾插入資料,所需時間都是固定的 將元素從任意位置刪除,所需要的時間也是固定的 插入或者刪除元素後,指向其它元素的迭代器仍然有效 |
不能像數組那樣用下標進行訪問 搜尋時間比vector要慢,因為list並不是儲存在一塊連續的記憶體空間中 搜尋時間和list容器中的元素個數成正比 |
| std::set |
關聯容器 |
搜尋時間比順序容器快得多 |
插入時間比順序容器慢 |
| std::multiset |
關聯容器 |
優點與set類似 在需要儲存重複的元素時,可以使用multiset |
缺點與set類似 |
| std::map |
關聯容器 |
用於存取索引值對的容器,並根據鍵來排序(map無法根據值來排序) 搜尋速度不和元素個數成正比 |
|
| set::multimap |
關聯容器 |
可以儲存鍵相同的元素 優點和map類似 |
缺點與map類似 |
Detail: map容器是儲存索引值對的,只能按照鍵來排序,如果想要值來排序的話,有幾種解決方案,1,建立一個map容器,將原來map裡的索引值對調換順序儲存到新的map容器中,當然,要保證逆序後的map索引值都是唯一的,否則可以使用multimap。 2,建立一個set或者vector容器,把map裡的每個索引值對儲存到新的set和vector裡,然後自訂排序的函數對象進行排序。 STL迭代器
最簡單的迭代器是指標,給定一個指向數組第一個元素的指標,可以遞增該指標依次訪問數組元素,當然,也可以操作指標所指向的元素。