STL
是個部件庫
(component library)
,其中的部件包括有容器
(container
,儲存任意類型對象的對象
)
和算法。只要用戶對自己定義的部件做點小小的要求,
STL
中的算法就可以工作在用戶自定義的容器上,或者
STL
中的容器可以使用用戶自定義的算法。
我們可以把軟件部件想象成一個三位空間。第一維表示數據類型(int, double, char, …),第二維表示容器(array, linked-list, …)
,
第三維表示算法
(sort, merge, search, …)
。
STL
包含
5
個主要的部分,
·算法
(Algorithm)
:能運行在不同容器
(container)
上的計算過程
·容器
(Container)
:能夠保留并管理對象的對象
·迭代器
(Iterator)
:算法存取容器
(algorithm-access to containers)
的抽象,以便算法可以應用在不同的容器上
·函數對象
(Function Object)
:定義了函數調用操作符
(operator())
的類
·適應器
(Adaptor)
:封裝一個部件以提供另外的接口
(
例如用
list
實現
stack)
正是因為有了Iterator,算法才和容器分開了.
容器
(Container)
是能夠保存其他類型的對象的類。容器形成了
STL
的關鍵部件。當書寫任何類型軟件的時候,把特定類型的元素集聚起來都是很至關重要的任務。
?????? STL
中有順序容器
(Sequence Container)
和關聯容器
(Associative Container)
。
STL
中支持的容器總結如下:
順序容器
(Sequence Container)
|
向量
(Vector)
|
?
|
雙向隊列
(Deque)
|
?
|
線性表
(List)
|
關聯容器
(Associative Container)
|
集合
(Set)
|
?
|
多集合
(MultiSet)
|
?
|
映射
(Map)
|
?
|
多映射
(MultiSet)
|
迭代器
(Iterator)
是指針
(pointer)
的泛化,它允許程序員以相同的方式處理不同的數據結構
(
容器
)
。
STL
中有
5
中類型的迭代器,它們分別滿足一定的要求。不同的迭代器要求定義的操作不一樣。
輸入和輸出迭代器
向前迭代器
雙向迭代器
任意存取迭代器
算法
STL
庫中的算法都以迭代器類型為參數,這就和數據結果的具體實現分離開了。基于此,這些算法被稱作基本算法
(generic algorithm)
。
如“尋找(Find)”、“鄰居尋找(Adjacent find)”、“計數(Count)”、“不匹配(Mismatch)”、“相等(Equal)”、“搜索(Search)
”拷貝(Copy)”、“交換(Swap)”、“變換(Transform)”、“替換(Replace)”、“填充(Fill)”、“產生(Generate)”、“遷移(Remove)”、“唯一(Unique)”、“翻轉(Reverse)”、“旋轉(Rotate)”、“任意洗牌(Random shuffle)”、“分區(Partitions)”
適應器
(Adaptor)
是提供接口映射的模板類
(Adaptors are template classes that provide interface mappings)
。適應器基于其他類來實現新的功能,成員函數可以被添加、隱藏,也可合并以得到新的功能。
棧
(Stack)
??????
棧可以用向量
(vector)
、線性表
(list)
或雙向隊列
(deque)
來實現:
stack<vector<int>>?????? s1;
stack<list<int>?????? >???? s2;
stack<deque<int>>s3;
隊列
(Queue)
??????
隊列可以用線性表
(list)
或雙向隊列
(deque)
來實現
(
注意
vector container
不能用來實現
queue
,
因為
vector
沒有成員函數
pop_front!
)
:
queue<list<int>>??? q1;
queue<deque<int>>?????? q2;
優先級隊列
(Priority Queue)
??????
優先級隊列可以用向量
(vector)
或雙向隊列
(deque)
來實現
(
注意
list container
不能用來實現
queue
,
因為
list
的迭代器不是任意存取
iterator
,而
pop
中用到堆排序時是要求
random access iterator
的
!
)
:
priority_queue<vector<int>, less<int>>??????? pq1;??????? //
使用遞增
less<int>
函數對象排序
priority_queue<deque<int>, greater<int>>??? pq2; ????? //
使用遞減
greater<int>
函數對象排序
迭代適應器
逆向迭代器
(Reverse Iterator)
??????
顧名思義,逆向迭代器的遞增是朝反方向前進的。對于順序容器
(vector, list
和
deque)
,其成員函數
rbegin()
和
rend()
都返回了相應的逆向迭代器:
list<int> l;
for (int i = 1; i < 5; i++)
?????? l.push_back(i);
copy(l.rbegin(), l.rend(), ostream_iterator<int> (cout, “ “));
輸出結果是:
4 3 2 1
?
插入迭代器
(Insert Iterator)
??????
插入迭代器簡化了向容器中插入元素的工作。插入迭代器指定了向容器中插入元素的位置。
STL
中有三種插入迭代器:
·向后插入
(back_insert_iterator)
,在容器尾部插入
·向前插入
(front_insert_iterator)
,在容器頭部插入
·插入
(insert_iterator)
,在容器中任一位置
STL
中提供了三個函數分別構造相應的插入迭代器:
·
back_inserter
·
front_inserter
·
inserter
?
原始存儲迭代器
(Raw Storage Iterator)
??????
該迭代器允許算法將其結果保存進沒有初始化的內存中。
函數適應器
否認者
(Negator)
??????
有兩個否認者
not1
和
not2
分別是一元和二元函數,它們分別使用一元和二元的謂詞
(Predicate)
,返回的是謂詞的結果的取反。
?
包扎者
(Binder)
?????? STL
中有兩個包扎者函數
bind1st
和
bind2nd
,可以將一些值限定在指定區間中。
?
函數指針的適應器
(Adaptors for pointers to function)
?????? STL
中的算法和容器一般都需要函數對象
(function object)
作為參數。如果想用到常用的
C++
函數時,可以用
ptr_fun
把普通函數轉換成函數對象。比如
ptr_fun(strcmp)
就把常用的串比較函數
strcmp
包裝成一個函數對象,就可用在
STL
算法和容器中了。