一、STL的簡要概述
STL(standard template library)中文可譯爲標準模板庫或者泛型庫,其包含有大量的模板類和模板函數,是 C++ 提供的一個基礎模板的集合,用來完成輸入/輸出、數學計算等功能。
STL 是一些容器、算法和其他一些組件的集合,所有容器和算法都是總結了幾十年來算法和數據結構的研究成果,彙集了許多計算機專家學者經驗的基礎上實現的,因此可以說,STL 基本上達到了各種存儲方法和相關算法的高度優化。
二、STL的組成結構
STL的組成 | 含義 |
---|---|
容器 | 一些封裝數據結構的模板類,例如 vector 向量容器、list 列表容器等。 |
算法 | STL 提供了非常多(大約 100 個)的數據結構算法,它們都被設計成一個個的模板函數,這些算法在 std 命名空間中定義,其中大部分算法都包含在頭文件 中,少部分位於頭文件 中。 |
迭代器 | 在 C++ STL 中,對容器中數據的讀和寫,是通過迭代器完成的,扮演着容器和算法之間的膠合劑。 |
函數對象 | 如果一個類將 () 運算符重載爲成員函數,這個類就稱爲函數對象類,這個類的對象就是函數對象(又稱仿函數)。 |
適配器 | 可以使一個類的接口(模板的參數)適配成用戶指定的形式,從而讓原本不能在一起工作的兩個類工作在一起。容器、迭代器和函數都有適配器。 |
內存分配器 | 爲容器類模板提供自定義的內存申請和釋放功能 |
三、STL中的容器
容器類型
容器種類 | 功能 |
---|---|
序列容器 | 主要包括 vector 向量容器、list 列表容器和deque 雙端隊列容器。序列容器: |
元素在容器中的位置同元素的值無關,即容器不是排序的。將元素插入容器時,指定在什麼位置,元素就會位於什麼位置。 | |
排序容器 | 包括 set 集合容器、multiset多重集合容器、map映射容器以及 multimap 多重映射容器。排序容器中的元素默認是由小到大排序好的,即便是插入元素,元素也會插入到適當位置。所以關聯容器在查找時具有非常好的性能。 |
哈希容器 | C++ 11 新加入 4 種關聯式容器,分別是 unordered_set 哈希集合、unordered_multiset 哈希多重集合、unordered_map 哈希映射以及 unordered_multimap 哈希多重映射。和排序容器不同,哈希容器中的元素是未排序的,元素的位置由哈希函數確定。 |
四、STL的迭代器
迭代器和 C++ 的指針非常類似,它可以是需要的任意類型,通過迭代器可以指向容器中的某個元素,如果需要,還可以對該元素進行讀/寫操作。、
用的迭代器按功能強弱分爲:輸入迭代器、輸出迭代器、前向迭代器、雙向迭代器、隨機訪問迭代器 5 種。
輸入迭代器和輸出迭代器,它們不是把數組或容器當做操作對象,而是把輸入流/輸出流作爲操作對象。
迭代器類別 | 說明 |
---|---|
前向迭代器 | 只能一次一個元素向前移動,並保留在容器中的位置 |
雙向迭代器 | 組合正向迭代器和逆向迭代器的功能,支持多遍算法 |
隨機訪問迭代器 | 組合雙向迭代器的功能與直接訪問容器中任何元素的功能,即可向前向後跳過任意個元素 |
- 前向迭代器(forward iterator)
假設 p 是一個前向迭代器,則 p 支持 ++p,p++,*p 操作,還可以被複制或賦值,可以用 == 和 != 運算符進行比較。此外,兩個正向迭代器可以互相賦值。
- 雙向迭代器(bidirectional iterator)
雙向迭代器具有正向迭代器的全部功能,除此之外,假設 p 是一個雙向迭代器,則還可以進行 --p 或者 p-- 操作(即一次向後移動一個位置)。
- 隨機訪問迭代器(random access iterator)
隨機訪問迭代器具有雙向迭代器的全部功能。除此之外,假設 p 是一個隨機訪問迭代器,i 是一個整型變量或常量,則 p 還支持以下操作:
p+=i:使得 p 往後移動 i 個元素。
p-=i:使得 p 往前移動 i 個元素。
p+i:返回 p 後面第 i 個元素的迭代器。
p-i:返回 p 前面第 i 個元素的迭代器。
p[i]:返回 p 後面第 i 個元素的引用。
容器對應的迭代器類型: