C++ stack與queue模擬實現(xiàn)詳解
stack與queue模擬實現(xiàn)
在stl中,stack(棧)與queue(隊列)都是容器適配器。
什么是容器適配器呢?
適配器(adaptor)是標(biāo)準(zhǔn)庫中通用的概念,包括容器適配器、迭代器適配器和函數(shù)適配器。本質(zhì)上,適配器是使一事物的行為類似于另一事物的行為的一種機制。容器適配器讓一種已存在的容器類型采用另一種不同的抽象類型的工作方式實現(xiàn)。簡單來說其實就是利用現(xiàn)有的容器來適配出來的新容器。
stack
在標(biāo)準(zhǔn)庫中,stack默認(rèn)使用的是deque容器來進(jìn)行適配的。
當(dāng)然這里也可以適配vector容器和list容器。
namespace ZJ { //template<class T,class Container= ZJ::list<T>> //template<class T,class Container= ZJ::vector<T>> template<class T,class Container= ZJ::deque<T>> class stack { public: void pop() { m_stack.pop_back(); } void push(const T&val) { m_stack.push_back(val); } size_t size() const { return static_cast<size_t>(m_stack.size()); } T& top() { return m_stack.back(); } const T& top() const { return m_stack.back(); } bool empty() const { return m_stack.empty(); } private: Container m_stack; }; }
queue
與stack一樣,在標(biāo)準(zhǔn)庫中默認(rèn)使用的是deque容器來進(jìn)行適配的。
namespace ZJ { template<class T,class Container=ZJ::deque<T>> class queue { public: void pop() { m_queue.pop_front(); } void push(const T& val) { m_queue.push_back(val); } size_t size() const { return static_cast<size_t>(m_queue.size()); } T& back() { return m_queue.back(); } const T& back() const { return m_queue.back(); } T& front() { return m_queue.front(); } const T& front() const { return m_queue.front(); } bool empty() const { return m_queue.empty(); } private: Container m_queue; }; }
為什么選擇deque作為stack和queue的底層默認(rèn)容器
stack是一種后進(jìn)先出的特殊線性數(shù)據(jù)結(jié)構(gòu),因此只要具有push_back()和pop_back()操作的線性結(jié)構(gòu),都可以作為stack的底層容器,比如vector和list都可以;
queue是先進(jìn)先出的特殊線性數(shù)據(jù)結(jié)構(gòu),只要具有push_back和pop_front操作的線性結(jié)構(gòu),都可以作為queue的底層容器,比如list。
但是STL中對stack和queue默認(rèn)選擇deque作為其底層容器,主要是因為:
1.stack和queue不需要遍歷(因此stack和queue沒有迭代器),只需要在固定的一端或者兩端進(jìn)行操作。
2.在stack中元素增長時,deque比vector的效率高(擴容時不需要搬移大量數(shù)據(jù));queue中的元素增長時,deque不僅效率高,而且內(nèi)存使用率高。
但是deque有一個致命缺陷:不適合遍歷,特別是在遍歷或者排序時,deque的迭代器要頻繁的去檢測其是否移動到某段小空間的邊界,導(dǎo)致效率低下。
總結(jié)
本片文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
c++雙向鏈表操作示例(創(chuàng)建雙向鏈、雙向鏈表中查找數(shù)據(jù)、插入數(shù)據(jù)等)
這篇文章主要介紹了c++雙向鏈表操作示例,包括創(chuàng)建雙向鏈、刪除雙向鏈表、雙向鏈表中查找數(shù)據(jù)、插入數(shù)據(jù)等,需要的朋友可以參考下2014-05-05