STL 容器介面卡

2021-06-14 15:20:45 字數 3545 閱讀 6265

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

言歸正傳,理解了什麼是介面卡以後,其實問題就很簡單的。c++中定義了3種容器介面卡,它們讓容器提供的介面變成了我們常用的的3種資料結構:棧(先進後出)佇列(先進先出)和優先順序佇列(按照優先順序(「<」號)排序,而不是按照到來的順序排序)。

至於具體是怎麼變的,我們可以先了解乙個大概:預設情況下,棧和佇列都是基於deque實現的,而優先順序佇列則是基於vector實現的。當然,我們也可以指定自己的實現方式。但是由於資料結構的關係,我們也不能胡亂指定。棧的特點是後進先出,所以它關聯的基本容器可以是任意一種順序容器,因為這些容器型別結構都可以提供棧的操作有求,它們都提供了push_back、pop_back和back操作。 佇列queue的特點是先進先出,介面卡要求其關聯的基礎容器必須提供pop_front操作,因此其不能建立在vector容器上;對於優先順序佇列,由於它要求支援隨機訪問的功能,所以可以建立在vector或者deque上,不能建立在list上。

讓我們看看這三種關聯容器提供的介面:

棧支援的操作有:

1.empty()  堆疊為空則返回真

2.pop()  移除棧頂元素

3.push()  在棧頂增加元素

4.size()  返回棧中元素數目

5.top()  返回棧頂元素

佇列支援的操作有:

1.back()  返回乙個引用,指向最後乙個元素

2.empty()  如果佇列空則返回真

3.front()  返回第乙個元素

4.pop()  刪除第乙個元素

5.push()  在末尾加入乙個元素

6.size()  返回佇列中元素的個數

優先順序佇列支援的操作有:

1.empty()  如果優先隊列為空,則返回真

2.pop()  刪除第乙個元素

3.push()  加入乙個元素

4.size()  返回優先佇列中擁有的元素的個數

5.top()  返回優先佇列中有最高優先順序的元素

舉個例子:

[cpp]

view plain

copy

print

?

intmain()  

//刪除棧頂元素

intstack.pop();  

}  cout<<"our program ran with "

<" errors! "

<return0;  

}

int main()

stack(const_myt& _right)  

: c(_right.c)  

explicitstack(const_container& _cont)  

: c(_cont)  

_myt& operator=(const_myt& _right)  

stack(_myt&& _right)  

: c(_std move(_right.c))  

explicitstack(_container&& _cont)  

: c(_std move(_cont))  

_myt& operator=(_myt&& _right)  

voidpush(value_type&& _val)  

template

<class_valty>  

voidemplace(_valty&& _val)  

voidswap(_myt&& _right)  

boolempty()const

size_type size()const

reference top()  

const_reference top()const

voidpush(constvalue_type& _val)  

voidpop()  

const_container& _get_container()const

voidswap(_myt& _right)  

protected:  

_container c;   // the underlying container

};  

template>

class stack

stack(const _myt& _right)

: c(_right.c)

explicit stack(const _container& _cont)

: c(_cont)

_myt& operator=(const _myt& _right)

stack(_myt&& _right)

: c(_std move(_right.c))

explicit stack(_container&& _cont)

: c(_std move(_cont))

_myt& operator=(_myt&& _right)

void push(value_type&& _val)

templatevoid emplace(_valty&& _val)

void swap(_myt&& _right)

bool empty() const

size_type size() const

reference top()

const_reference top() const

void push(const value_type& _val)

void pop()

const _container& _get_container() const

void swap(_myt& _right)

protected:

_container c; // the underlying container

};

從中我們可以清楚的看到:棧在預設情況下,是基於deque實現的,它使用封裝的順序容器的操作來實現的自己的操作。相信裡面的大部分內容我們都能看懂個大概。

STL容器介面卡

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

STL容器介面卡

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

stl 容器介面卡

介面卡是一種設計模式,將乙個類的介面轉換為另外乙個類介面。在 stl 中,常見的容器介面卡有 stack queue 和 priority queue。容器介面卡就是將特定容器類封裝作為其底層容器類。在標準 stl 中,stack和queue預設底層容器都是deque。其實作為容器介面卡,底層可以是...