C++知識點(十)泛型程式設計與C++STL標準模板庫
1.泛型程式設計
把程式碼從特定的資料結構中分離出來,使得它不依賴於特定的資料結構而更加通用
容器->迭代器->演算法
介面卡
2.概念:用於界定具備一定功能的資料型別
comparable:可比較
Assignable:可賦值
Sortable:可比較且可賦值
3.模型:符合一個概念的資料型別就是該概念的模型
e.g. int 為comparable概念的模型
4.用概念做模板引數名
5.STL:standard template library 容器、迭代器、函式物件、演算法
容器<->迭代器(作為演算法的引數)->演算法 ->函式物件(作為演算法的引數)
- 容器:標頭檔案<vector>
- 順序
- 有序關聯
- 無序關聯
- 容器介面卡:棧stack 佇列queue 優先佇列priority_queue
- 迭代器:泛型指標,包含標頭檔案<iterator>
- ++,*,->,--
- 函式物件:泛化的函式 ,標頭檔案<functional>
- 演算法:標頭檔案<algorithm>
transform
6.迭代器:泛型指標
輸入流迭代器 istream_iterator <T> (cin) *(p++)
輸出流迭代器 ostream_iterator <T> (cout,“輸出間隔”) *(p++)=x
前向迭代器:輸入&輸出迭代器,且可單向遍歷
雙向迭代器:輸入&輸出迭代器,且可雙向遍歷
隨機訪問迭代器:雙向迭代器,且可在任意兩個位置跳轉
兩個迭代器表示一個區間[p1,p2)
迭代器的輔助函式:advance(p,n);distance(first,last)
7.容器基本功能和分類
迭代器訪問方式分類:可逆容器,隨機訪問容器
容器資料組織方式分類:順序容器、關聯容器(有序、無序)
容器通用功能:
- 預設建構函式構造空容器
- 關係運算
- begin(),end()
- clear()
- empty()
- size()
- s1.swap(s2)
相關資料型別:S::iterator,S::const_iterator
對可逆容器的訪問:rbegin(),rend()
相關資料型別:S::reverse_iterator,S::reverse_const_iterator
8.順序容器:(長度可擴充套件的陣列)
vector ,queue, list, forward_list(特殊的新增刪除操作), array(大小固定)
線性排列,隨時插入刪除元素,可賦值(assignable)
介面(不包括array和foward_list):
- 建構函式
- 賦值函式assign
- 插入函式insert、push_front(list deque)、push_back、emplace、emplace_front
- 刪除函式erase、clear、pop_front(list deque)、pop_back、emplace_back
- 首尾元素的直接訪問front、back
- 改變大小resize
9.順序容器
- vector 隨機訪問快,插入刪除慢
- 向量的容量:s.capacity() ;s。reserve(n) 使容量至少為n, 不夠則擴充套件
- deque:兩端插入刪除快,中間插入刪除慢,隨機訪問較快,比vector慢
- list:插入刪除快,不能隨機訪問,能拼接操作
- forward_list:
- array: 大小固定
順序容器的比較
- 大量隨機訪問:vector
- 少量隨機訪問,兩端插入: deque
- 不需隨機訪問,需插入刪除:list
- 陣列:array
順序容器的插入迭代器
- 前插迭代器
- 後插迭代器
- 任意位置插迭代器
順序容器的介面卡:以順序容器為基礎構建一些常用的資料結構,對順序容器進行封裝
- 棧stack:先進後出 ;任意一種順序容器為基礎
- 佇列queue:先進先出;以前插順序容器list deque為基礎
- 優先順序佇列priority_queue:最大的元素先出
棧和佇列共同支援操作:
- s1 operator s2; size() ;empty() ;pop() ;push();
棧支援的操作:top()
佇列支援的操作:front();back();
10.關聯容器
特點:每個關聯容器都有一個key,可高效查詢元素
介面:插入insert、刪除erase、查詢find、定界low_bound upper_bound equal_range、計數count
單重關聯容器:map、set 鍵值唯一,一個鍵值對應一個元素
多重關聯容器:multiset、multimap 鍵值不唯一,一個鍵值對應一個元素
簡單關聯容器:set、multiset 只有一個型別引數鍵,容器元素就是鍵本身
二元關聯容器:map、multimap 有兩個型別引數,分別表示鍵和元素型別
無序關聯容器:unordered_set、unordered_map、unordered_multiset、unordered_multimap
雜湊函式和鍵型別的==運算子來組織元素
11.集合set:儲存一組無重複的元素,有序,資料型別為鍵本身
12.對映map:資料型別為鍵和附加資料構成的二元組(key,value)
13.多重集合和多重對映:去掉了鍵為一的限制
14.函式物件
15.函式介面卡
16.演算法