本篇内容介绍了“C++中stack与queue的使用方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
在stl中,stack(栈)与queue(队列)都是容器适配器。
什么是容器适配器呢?
适配器(adaptor)是标准库中通用的概念,包括容器适配器、迭代器适配器和函数适配器。本质上,适配器是使一事物的行为类似于另一事物的行为的一种机制。容器适配器让一种已存在的容器类型采用另一种不同的抽象类型的工作方式实现。简单来说其实就是利用现有的容器来适配出来的新容器。
在标准库中,stack默认使用的是deque容器来进行适配的。
当然这里也可以适配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; }; }
与stack一样,在标准库中默认使用的是deque容器来进行适配的。
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; }; }
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不仅效率高,而且内存使用率高。
但是deque有一个致命缺陷:不适合遍历,特别是在遍历或者排序时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下。
“C++中stack与queue的使用方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。