STL概述
STL頭文件和容器類
#include Container Class
<deque> deque
<list> list
<map> map, multimap
<queue> queue, priority_queue
<set> set, multiset
<stack> stack
<vector> vector
相關重要概念
- 儘管具有多重繼承的基於對象的層次結構在觀念上是最直接的,但是在實際上較爲困難.基於對象層次的一種更可取的選擇:包容器類被作爲參數化類型的大型預處理宏,而不是帶自變量的模板,這些自變量能爲我們所希望的類型代替
- 對其進行簡化並將它從預處理範圍移入了編譯器,這種新的代碼替換裝置被稱爲模板,而且它表現了完全不同的代碼重用方法,模板對源代碼進行復用,而不是通過繼承和組合重用對象代碼,當用戶使用模板時,參數由編譯器來替換,這非常像原來的宏方法,卻更清晰,更容易使用
- 模板使用類和函數可在編譯時定義所需要處理和返回的數據類型,一個模板並非一個實實在在的類或函數,僅僅是一個類或函數的描述.由於模板可以實現邏輯相同,數據類型不同的程序代碼複製,所以使用模板機制可以減輕編程和維護的工作量和難度.模板一般爲函數模板,和類模板,函數模板定義了參數化的非成員函數,這使得程序員能夠用不同類型的參數調用相同的函數,由編譯器決定該用那一種類型,並且從模板函數中生成相應代碼,所以只要類型不一樣,但是處理上是完全相同的,這時可以使用函數模板
STL 的五大部分
- 迭代器(iterators)
- 算法(algorithms)
- 容器(containers)
- 函數對象(function objects)
- 內存分配(allocators)
函數模板功能非常強大,但是有時候可能會陷入困境,假如待比較的函數模板沒有提供正確的操作符,則程序不會對此進行編譯,可以使用函數模板與同名的非模板函數重載,這就是函數的制定.函數模板與同名的非模板函數重載必須遵循以下的規則
- 尋找一個參數完全匹配的函數,如果找到就調用它;
- 如果失敗,尋找一個函數模板,使其實例化,產生一個匹配的模板函數,如果找到了,就調用它
- 如果失敗了,再試低一級的對函數重載的方法,例如通過類型轉換可產生的參數匹配等,如果找到了匹配的函數,就調用它
- 如果失敗了,則證明這是一個錯誤調用
模板中的友元函數
- 非模板函數,類成員所有實例的友元
- 模板函數,模板類成爲同類型實例的友元
- 模板函數,類成爲不同類型實例類的友元
STL 的容器
說明:
- vector<T> 是一種大小不可變的向量
- list<T> 是一個雙向鏈表容器
- queue<T> 是一種隊列容器
- stack<T> 是一種棧容器
- deque<T> 是一種雙端隊列容器
- priority_queue<T> 是一種按值排序的隊列容器
- set<T> 是一種集合容器
- multiset<T> 是一種充許出現重複元素的集合容器
- map<key,val> 是一種關聯數組容器
- multimap<key,val> 是一種充許出現重複key值的關聯容器
迭代器
簡介:
無論從何種意義上來說,都可以認爲迭代器就是一個指示器,然而,迭代器技術能夠使程序反覆對STL容器的內容進行訪問,所以非常快捷和重要,對容器的內容進行反覆地訪問,意味着一次就可以訪問一個或多個元素
分類:
- 輸入迭代器: 主要用於爲程序中需要的數據源提供輸入接口,這裏所指的數據源可以是容器,數據流等,輸入迭代器只能夠一個序列讀入數據,這種迭代器可以被修改,並且以並進行比較
- 輸出迭代器: 主要用於輸出程序中已得到的數據結果,這裏指的結果可以是容器,數據流等,輸出迭代器只能夠向一個序列寫入數據,這種迭代器可以被修改和引用
- 向前迭代器: 可以隨意訪問序列中的元素,許多STL算法函數需要提供向前迭代器,向前迭代器既可以用來讀也可以用來寫,這種迭代器結合了輸入輸出迭代器的功能,並且能夠保證迭代器的值,以便從起原先位置開始重新遍歷
- 隨機接入迭代器: 可以通過跳躍的方式訪問容器中得任意數據,從而使數據的訪問非常靈活,隨機訪問迭代器作爲功能最強大的迭代器類型,具有雙向迭代器的所有功能,並且能夠靈活使用算法和所有的迭代器比較功能
說明:
- 迭代器的出現讓算法和容器的分離成爲可能,算法是模板,器類型依賴於迭代器,因此不會侷限於單一的容器
- 不同的STL算法需要不同類型的迭代器來實現相應的功能,因爲不同類型的STL容器支持不同類型的迭代器,所以不能對所有的容器使用相同的算法
區別:
迭代器類型 迭代器能力 支持的容器類型
輸入迭代器(input iterator) 向前讀取能力 istream
輸出迭代器(output iterator) 向前寫能力 ostream,inserter
向前迭代器(forward iterator) 向前讀和寫能力 -
雙向迭代器(Bidirectional iterator) 向前和方向讀和寫能力 list,set,multiset,map,multimap
隨機訪問迭代器(Random access iterator) 隨機讀和寫能力 vector,deque,string等