C 接配器 Adapter 總結

2022-06-13 06:15:09 字數 3189 閱讀 9307

近日在看《stl原始碼解析》,stl裡面一大堆泛型程式設計的確是非常巧妙,不過由於時間有限,我還是只能更加專注於日常使用比較多的一些知識。

adapter是我在最開始使用stl container的時候就聽到的乙個詞,一直以來沒有比較深入的了解,藉著這次學習stl原始碼,在這裡總結一下:

首先是adapter的定義,《design patterns》中對於adapter的定義我覺得真的十分準確:將乙個class的介面轉換成另乙個class的介面,使原本因介面不相容而不能合作的class可以一起運作。這很直接就能讓我想到日常生活中常見的adapter:電源介面卡。同樣的,其實兩者的作用也差不多。

stl裡面主要有兩種接配器(adapter):容器接配器(container adapter)和迭代器接配器(iterator adapter),下面舉幾個例子了解一下這兩類主要的adapter:

container adapter:

最常用的容器接配器無非是queue和stack,從意義上來說,他們為底層的容器提供了一層包裝,使得底層的容器只表現出這些接配器所定義的資料結構的功能。

這裡假設底層容器是deque,雙向開口,而且兩端插入刪除都能夠實現o(1)的時間複雜的。當作為queue進行包裝的時候deque就會封閉一端的插入操作,封閉另一端的刪除操作,使得整個deque表現出fifo的特性,在作為stack的時候同理。

可以看到container adapter做到的功能很直觀,也很好理解,只是對於容器的一層包裝,改變了資料結構的介面的同時方便了我們對其的理解和使用。

iterator adapter(#include)

迭代器接配器是我原先並不是很熟悉的,對於stl中iterator的使用我可能最多的也就是begin(),end(),const_iterator,rbegin()等等,而在這裡我要講的iterator adapter主要有三種,分別是insert iterator,reverse iterator,iostream iterator。

首先是insert iterator。從定義上來講,它的作用是將一般迭代器的賦值(assign)操作轉變為插入(insert)操作。理解了這句話也就理解了insert iterator的本質。

下圖顯示的是stl裡面insert iterator的主要用法:

這三種形式的最大區別無非就是使用adapter之後元素插入的位置了。

先來一段最簡單的測試**:

1 #include2 #include3 #include4

using

namespace

std;56

intmain();

8for(int i = 0;i<10;++i)

1112

for(auto j:data) cout

13 cout<

14return0;

15 }

輸出結果:623

4590

1234

5678

9

可以看到,我們依然可以把經過iterator adapter修飾之後的結果當成是一種迭代器,依然可以用*符號,但不同的是當你對它進行賦值的時候,它將自動進行insert操作。使用原書中的描述應該更好:

也就是說在insert iterator的封裝下,該iterator只是將assign操作變成了push_back,push_front,insert,而其他操作++,--,*全部返回原先的iterator

這也就能夠解釋copy函式的時候進行複製的底層實現了,在每複製乙個值後的++對insert iterator並不起作用,只有賦值assign會起到相關操作。

當使用copy函式的時候:

1 #include2 #include3 #include4 #include5

using

namespace

std;67

intmain();

9 vector res=;

10copy(data.begin(),data.end(),back_inserter(res));

11for(auto j:res) cout

12 cout<

13return0;

14 }

輸出結果:211

6234

59

copy的時候每次都是從res的末尾插入乙個數字並進行copy,而不像copy本義中只存在的賦值而已。

reverse iterator:

顯然作用是使得iterator方向相反,常和rbegin,rend一起使用,比如:

1 #include2 #include3 #include4 #include5

using

namespace

std;67

intmain();

9 vector::reverse_iterator it =data.rbegin();

10for(;it!=data.rend();++it) cout<

11 cout<

12return0;

13 }

輸出:954326
iostream iterator:

1 #include //

std::cout

2 #include //

std::ostream_iterator

3 #include //

std::vector

4 #include //

std::copy56

intmain ()

輸出:10, 20, 30, 40, 50, 60, 70, 80, 90,
從上面的例子中可以看到,接配器(adapter)在stl中有著重要作用,其和copy等常用函式關係緊密,同樣可以和輸入輸出等操作進行結合。  

參考:《stl原始碼剖析》

C 介面卡模式(Adapter)

理解 舊的介面不能被客戶直接呼叫,需要第三方類進行轉換。就好像usb轉換器一樣 using system.windows.forms namespace designmode.adatper 觀眾要看的中文電影 public class movie chinese 繼承放中文電影的介面 public...

c 介面卡模式 adapter

當兩個系統的介面不一樣時,我們就要重新封裝一下介面,以便於當前系統的呼叫。這種模式叫做介面卡模式。介面卡模式分為兩種 1.物件組合介面卡 object adapter 2.類介面卡 class adapter 採用類繼承的方式實現。下面是物件介面卡的使用。include include using ...

C 設計模式 介面卡(Adapter)

為了使得介面不相容的類可以在一起工作,使用介面卡模式 分為兩類介面卡 1.類介面卡 using system namespace adapter private string translate string word 中文目標 inte ce ichinesetarget 英文被適配者 class...