什麼是適配器,C++ STL容器適配器詳解

在詳解什麼是容器適配器之前,初學者首先要理解適配器的含義。

其實,容器適配器中的“適配器”,和生活中常見的電源適配器中“適配器”的含義非常接近。我們知道,無論是電腦、手機還是其它電器,充電時都無法直接使用 220V 的交流電,爲了方便用戶使用,各個電器廠商都會提供一個適用於自己產品的電源線,它可以將 220V 的交流電轉換成適合電器使用的低壓直流電。

從用戶的角度看,電源線扮演的角色就是將原本不適用的交流電變得適用,因此其又被稱爲電源適配器。

再舉一個例子,假設一個代碼模塊 A,它的構成如下所示:

class A{
public:
    void f1(){}
    void f2(){}
    void f3(){}
    void f4(){}
};

現在我們需要設計一個模板 B,但發現,其實只需要組合一下模塊 A 中的 f1()、f2()、f3(),就可以實現模板 B 需要的功能。其中 f1() 單獨使用即可,而 f2() 和 f3() 需要組合起來使用,如下所示:

class B{
private:
    A * a;
public:
    void g1(){
        a->f1();
    }
    void g2(){
        a->f2();
        a->f3();
    }
};

可以看到,就如同是電源適配器將不適用的交流電變得適用一樣,模板 B 將不適合直接拿來用的模板 A 變得適用了,因此我們可以將模板 B 稱爲 B 適配器。

容器適配器也是同樣的道理,簡單的理解容器適配器,其就是將不適用的序列式容器(包括 vector、deque 和 list)變得適用。容器適配器的底層實現和模板 A、B 的關係是完全相同的,即通過封裝某個序列式容器,並重新組合該容器中包含的成員函數,使其滿足某些特定場景的需要。

容器適配器本質上還是容器,只不過此容器模板類的實現,利用了大量其它基礎容器模板類中已經寫好的成員函數。當然,如果必要的話,容器適配器中也可以自創新的成員函數。

需要注意的是,STL 中的容器適配器,其內部使用的基礎容器並不是固定的,用戶可以在滿足特定條件的多個基礎容器中自由選擇。

STL容器適配器的種類

STL 提供了 3 種容器適配器,分別爲 stack 棧適配器、queue 隊列適配器以及 priority_queue 優先權隊列適配器。其中,各適配器所使用的默認基礎容器以及可供用戶選擇的基礎容器,如表 1 所示。

容器適配器 基礎容器篩選條件 默認使用的基礎容器
stack 基礎容器需包含以下成員函數:empty()size()back()push_back()pop_back()滿足條件的基礎容器有 vector、deque、list。 deque
queue 基礎容器需包含以下成員函數:empty()size()front()back()push_back()pop_front()滿足條件的基礎容器有 deque、list。 deque
priority_queue 基礎容器需包含以下成員函數:empty()size()front()push_back()pop_back()滿足條件的基礎容器有vector、deque。 vector

不同場景下,由於不同的序列式容器其底層採用的數據結構不同,因此容器適配器的執行效率也不盡相同。但通常情況下,使用默認的基礎容器即可。當然,我們也可以手動修改,具體的修改容器適配器基礎容器的方法,後續講解具體的容器適配器會詳細介紹。

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