- 設計模式:將一個類的接口轉化為另外一個類的接口
配接器的概觀和分類
- 改變仿函數接口? 函數配接器? ;queue和stack 通過修飾deque函數接口來實現
- 改變容器接口? ? ? 容器配接器? ; insert、reverse、iostream 等iterators他們的接口可以由iterator獲得
insert?iterator
- 將一般迭代器的賦值操作轉變為插入操作
- 例子:尾部插入 back_insert_iterator ; 頭部插入 front_insert_iterator ;任意位置 insert_insert_iterator
- 對應的函數封裝
Reverse Iterators
- ?將迭代器的行進方向進行逆轉,使得operator++變成 后退操作;operator--變成前進操作
- 主要目的是為了 從尾端進行前進的算法上
Iostream Iterators
- 將迭代器綁定到某一個 iostream對象身上
- 例子:綁定到istream(std::cin) 稱為 istream_iterator,擁有輸入功能
- 例子:綁定到istream(std::cout) 稱為 ostream_iterator,擁有輸出功能,用于屏幕輸出
- 改變迭代器接口? ?迭代器配接器
#include <iterator>
#include <deque>
#include <algorithm>
#include <iostream>int main(){//將outite綁定到cout//每次對 outite 指派一個元素,隨后接一個" "std::ostream_iterator<int>outite(std::cout," ");int ia[] = {0,1,2,3,4,5};std::deque<int>id(ia,ia+6);//將所有的元素拷貝到outite(也就是拷貝到cout)std::copy(id.begin(),id.end(),outite); //0 1 2 3 4 5std::cout << '\n';//將ia[] 的部分元素拷貝到id內,使用front_insert_iterator//注意:front_insert_iterator會將assign 操作改為push_front操作//因為vector不支持push_front()std::copy(ia+1,ia+2, std::front_inserter(id));std::copy(id.begin(),id.end(),outite);std::cout << '\n';std::copy(ia+3,ia+4, std::back_inserter(id));std::copy(id.begin(),id.end(),outite);std::cout << '\n';//搜尋元素5所在的位置std::deque<int>::iterator ite = std::find(id.begin(),id.end(),5);std::copy(ia+0,ia+3, std::inserter(id,ite));std::copy(id.begin(),id.end(),outite);std::cout << '\n';//將所有元素逆向拷貝//使用rbegin() 和 rend() 關聯到revere_iteratorstd::copy(id.rbegin(),id.rend(),outite);std::cout << '\n';
}
應用于仿函數
- ?配節操作:系結(bind)、否定 、組合、對一般成員或者成員函數的修飾
?
- 注意事項:期望獲得配接能力的組件,本身必須是可以配接的,即一元仿函數需要繼承unary_function、二元仿函數需要繼承binary_function、成員函數必須以mem_fun處理過、一般函數需要以ptr_fun處理過
- 一個未經ptr_fun處理過的一般函數,雖然可以使用,但是沒有任何的配接的 能力
?容器適配器
- stack
- stack封裝了所有deque的對外接口,只有符合規則的函數才會被開放,因此stack是作用于容器上的配接器
- queue
?Iterator adapters
insert iterators
- 內部維護一個容器,容器有自己的迭代器,因此客戶端對insert iterators賦值操作,在insert iterators中轉換成對這個容器的迭代器進行插入操作
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?