標準模板庫,是一組模板類和函數,向程序員提供了 :
- 存儲信息的容器
- 訪問存儲信息的迭代器
- 操作容器內容的算法
簡單的來說,就是分爲三部分,算法,迭代器,容器,其中迭代器是算法和容器之間的橋樑,可以讓程序員可以通過算法對容器進行操作,而且這些算法也不是容器相關的,比如說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迭代器
最簡單的迭代器是指針,給定一個指向數組第一個元素的指針,可以遞增該指針依次訪問數組元素,當然,也可以操作指針所指向的元素。