首先,我們要明白介面卡是幹什麼的?其實就是乙個介面轉換裝置,是得我們能用特定的方法去操作一些我們本來無法操作的東西。舉乙個例子,比如你的乙個裝置支援串列埠線,而你的電腦支援的是usb口,這時候,我們沒有必要重新買乙個支援usb的裝置,只需要一根串列埠轉usb口的小玩意,讓你的裝置能夠連線到usb插口上,而它就是介面卡。
那麼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
intmain()
//刪除棧頂元素
intstack.pop();
} cout<<"our program ran with "
<" errors! "
<
return
0;
}
最後我們可以窺探一下stl中的原始碼:
[cpp]view plain
copy
template
<
class
_ty,
class
_container = deque<_ty> >
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)
template
<
class
_valty>
void
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實現的,它使用封裝的順序容器的操作來實現的自己的操作。相信裡面的大部分內容我們都能看懂個大概。這裡就不做過多解釋了。
容器介面卡(棧容器介面卡 佇列容器介面卡)
我們已有的容器 比如vector list 這個容器支援的操作很多,比如插入,刪除,迭代器訪問等等。而我們希望這個容器表現出來的是棧的樣子 先進後出,入棧出棧等等,此時,我們沒有必要重新動手寫乙個新的資料結構,而是把原來的容器重新封裝一下,改變它的介面,就能把它當做棧使用了。c 定義了三種容器介面卡...
容器介面卡
容器介面卡通常是讓一種已存在的容器型別採用另一種不同的抽象型別的工作方式實現,一般情況下,它的初始化需要傳遞乙個容器作為引數,而它所有的操作也是在這個容器上實現的。標準庫提供了三種順序容器介面卡 stack queue priority queue,使用它們時需要包含 include 和 inclu...
容器介面卡
容器介面卡 stl 中包含三種介面卡 棧stack 佇列queue 和優先順序priority queue 介面卡是容器的介面,它本身不能直接儲存元素,它儲存元素的機制是呼叫另一種順序容器去實現,即可以把介面卡看作 它儲存乙個容器,這個容器再儲存所有元素 stl 中提供的三種介面卡可以由某一種順序容...