STL 概述

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等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章