1. 程式人生 > >C++知識點(十)泛型程式設計與C++STL標準模板庫

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.演算法