C++的 STL 是一個功能強大的庫,它是建立在模板機制上,能夠滿足用戶對存儲管理不同類型數據的通用容器和施加在這些容器上的通用算法的巨大需求,並且具有完全的可移植性。因此在尋求程序的解決方案時,應該首先在 STL 中尋求恰當的容器和算法。
STL 是一個通用性極高的編程工具,這種通用性不僅表現在可以使用通用的容器存儲和管理任意類型的數據,更重要的是可以對不同的容器施加統一通用的算法和操作。實現這種通用性的關鍵思想就是:通過引進一個間接層對象對不同結構的數據容器進行統一的訪問操作,從而簡化了對容器的操作,使得實現操作的算法和函數通用化。這種思想是 STL 的設計原則之一,也是軟件設計中一個重要設計思想。 在 STL 中對容器訪問的簡化和獨立就是通過循環子實現的,循環子可以無須依據某種特定容器的數據結構而完成對容器元素的訪問,從而使得數據的存儲結構與施加於數據的操作相互獨立。標準模板庫 STL 是由容器類模板,用於訪問這些容器的循環子類模板和可以通過循環子在這些容器上實現的各種算法類模板以及函數類模板組成的。STL 爲這種標準算法和函數(包括用戶定義的函數)藉助循環子在容器上實現的應用建立了統一的規則。
容器:可容納各種數據類型的數據結構。
迭代器:可依次存取容器中元素的東西,連接容器和算法
算法:用來操作容器中的元素的函數模板。例如,STL用sort()來對一個vector中的數據進行排序,用find()來搜索一個list中的對象。
函數本身與他們操作的數據的結構和類型無關,因此他們可以在從簡單數組到高度複雜容器的任何數據結構上使用。
比如,數組int array[100]就是個容器,而 int * 類型的指針變量就可以作爲迭代器,可以爲這個容器編寫一個排序的算法
一、容器
(一)容器綜述
標準庫中定義了兩種標準的容器:
1、序列容器(Sequence):向量 vector、表 list 和雙向隊列 deque。
vector:後部插入/刪除,直接訪問
deque:前/後部插入/刪除,直接訪問
list:雙向鏈表,任意位置插入/刪除
2、關聯容器 (Associative container)
映射 map、multimap 和集合 set、multiset。
set:快速查找,無重複元素
multiset :快速查找,可有重複元素
map:一對一映射,無重複元素,基於關鍵字查找
multimap :一對一映射,可有重複元素,基於關鍵字查找
前兩種合稱爲第一類容器。
3、序列轉接器容器(又名容器適配器)(Sequence Adapter)
是一種可以改變函數對象或容器接口的組件。
序列轉接器:堆棧 stack、隊列 queue 和優先級隊列priority_queue。
stack:LIFO
queue:FIFO
priority_queue:優先級高的元素先出
對象被插入容器中時,被插入的是對象的一個複製品。
4、預定義數組、字符串類 string、數值數組類 valarray 和位集合 bitset 均可以視爲容器,但不是標準容器。標準容器的成員絕大部分都具有共同的成員名。,
(1)類型成員
(2)循環子操作
(3)訪問元素操作
front():返回容器中第一個元素的引用,back():返回容器中最後一個元素的引用。比如,查 list::front 的help,得到的定義是:
reference front();
const_reference front() const;
list有兩個front函數
reference 和 const_reference 是typedef的類型
對於 list<double> ,
list<double>::reference 實際上就是 double &
list<double>::const_reference 實際上就是 const double &
對於 list<int> ,
list<int>::refrence 實際上就是 int &
list<int>::const_refreence 實際上就是 const int &
(4)堆棧和隊列操作
push_back(): 在容器末尾增加新元素
pop_back(): 刪除容器末尾的元素
(5)表操作
(6)其他操作
(7)構造函數,析構函數
(8)分配操作
(9)關聯操作
(10)標準容器的操作比較(複雜度)
表中各種容器所對應的表項的含義如下:
① 空表項:表示容器無此項操作。
② const:表示容器此項操作的時間複雜度爲常量。
③ O(n):表示容器此項操作的時間複雜度與容器中元素個數n的線性相關。
④ O(n)+:表示容器此項操作的時間複雜度與容器中元素個數n線性相關並且還需要增加一些附加操作時間花費。
⑤ O(log(n)):表示容器此項操作的時間複雜度與容器中元素個數n對數相關。
⑥ O(log(n))+:表示容器此項操作的時間複雜度與容器中元素個數n對數相關並且還需要增加一些附加操作時間花費。
⑦ Ran:表示容器對應的循環子爲隨機訪問循環子。
⑧ Bi:表示容器對應的循環子爲雙向訪問循環子。