stl 容器介面卡

2021-09-09 08:00:46 字數 2019 閱讀 6324

介面卡是一種設計模式,將乙個類的介面轉換為另外乙個類介面。在 stl 中,常見的容器介面卡有 stack、queue 和 priority_queue。容器介面卡就是將特定容器類封裝作為其底層容器類。

在標準 stl 中,stack和queue預設底層容器都是deque。其實作為容器介面卡,底層可以是任意的標準容器類模板之一,如果沒有例項化指定底層容器,底層都預設是deque。他們只支援棧頂或者隊頭隊尾進行操作,不能遍歷,所有沒有維護迭代器。

優先順序佇列 priority_queue,相當於堆。那麼對於 priority_queue的底層容器,要能實現隨機訪問和迭代器。滿足要求的標準容器類有 vector 和 deque。預設情況下,如果沒有為特定的 priority_queue 類例項化指定容器類,則使用 vector。

優先順序佇列預設使用vector作為其底層儲存資料的容器,在vector上又使用了堆演算法將vector中元素構造成堆的結構。預設情況下priority_queue是大堆。

為什麼 stack 和 queue 預設底層容器使用 deque?

stack是一種後進先出的特殊線性資料結構,因此只要具有 push_back() 和 pop_back() 操作的線性結構,都可以作為stack的底層容器,比如 vector 和 list 都可以;queue 是先進先出的特殊線性資料結構,只要具有 push_back 和 pop_front 操作的線性結構,都可以作為 queue 的底層容器,比如 list。但是 stl 中對 stack 和 queue 預設選擇 deque 作為其底層容器,主要是因為:

1. stack 和 queue 不需要遍歷(因此 stack 和 queue 沒有迭代器),只需要在固定的一端或者兩端進行操作。

2. 在 stack 中元素增長時,deque 比 vector 的效率高;queue 中的元素增長時,deque 不僅效率高,而且記憶體使用率高。

我們來看一下關於 stack 的構造:

// constructing stacks

#include // std::cout

#include // std::stack

#include // std::vector

#include // std::deque

int main ()

我們可以看出來,stack不僅可以使用deque作為底層容器來初始化構造,還可以使用 vector來當做底層容器來構造,需要在模板引數中宣告。 

同樣的,queue 的初始化構造和 stack 類似:

// constructing queues

#include // std::cout

#include // std::deque

#include // std::list

#include // std::queue

int main ()

#include#includeusing namespace std;

template>

class stack

void pop()

size_t size()

bool empty()

t& top()

const t& top() const

private:

container con;

};template>

class queue

void pop()

size_t size()

bool empty()

t& front()

const t& front() const

t& back()

const t& back() const

private:

container con;

};int main()

程式執行結果:

STL 容器介面卡

那麼c 中的容器介面卡是幹什麼的呢?可以做乙個模擬,我們已有的容器 比如vector list deque 就是裝置,這個裝置支援的操作很多,比如插入,刪除,迭代器訪問等等。而我們希望這個容器表現出來的是棧的樣子 先進後出,入棧出棧等等,此時,我們沒有必要重新動手寫乙個新的資料結構,而是把原來的容器...

STL容器介面卡

stl學習系列之六 容器介面卡 stl提供了三種容器介面卡 stack,queue,priority queue。介面卡並不是第一類容器,因為它們並沒有提供與元素的儲存形式有關的真正資料結構實現,並且介面卡不支援迭代器。介面卡的優點是 能夠使程式設計師選擇一種合適的底層資料結構。這三個介面卡類都提供...

STL容器介面卡

首先,我們要明白介面卡是幹什麼的?其實就是乙個介面轉換裝置,是得我們能用特定的方法去操作一些我們本來無法操作的東西。舉乙個例子,比如你的乙個裝置支援串列埠線,而你的電腦支援的是usb口,這時候,我們沒有必要重新買乙個支援usb的裝置,只需要一根串列埠轉usb口的小玩意,讓你的裝置能夠連線到usb插口...