【C++初阶】容器适配器模拟实现栈和队列(附源码)

简介: 【C++初阶】容器适配器模拟实现栈和队列(附源码)

一.容器适配器

其实在使用模板时,我们不仅可以使用类模板,还可以使用容器模板,这就是一个容器适配器,我们可任意给模板实例化不同的容器,然后就可以使用容器里的接口

template<class T,class Containers>

我们知道,栈可以用数组实现也可以用链表实现,以前在C语言那里,如果我们想要两个底层不同的栈,要么写两个栈,要么用typedef,但这做不到自由控制;在C++中,我们可以容器适配器解决这个问题,数组链表秒切换。

注意使用的接口必须是你实例化的容器所拥有的,否则会报错

例:

 vector容器没有头插(push_front)和头删(pop_front)接口

 list却有这两个接口,所以在使用时要特别注意。


二.模拟实现stack

库里栈的模板是这样的,这个deque是一个双端队列,它同时拥有vector和list的接口

 

上图是栈的接口,都很简单,栈符合先进后出,下面就让我们用容器适配器模拟实现栈吧。

 

源码

1. template<class T,class Containers=deque<T>>  //容器适配器
2.  class stack   //栈
3.  {
4.  public:
5.    void push(const T& val)   //入栈,即尾插
6.    {
7.      _con.push_back(val);
8.    }
9. 
10.     void pop()   //出栈,即尾删
11.     {
12.       _con.pop_back();
13.     }
14. 
15.     const T& top() const  //取栈顶元素
16.     {
17.       return _con.back();
18.     }
19. 
20.     bool empty()
21.     {
22.       return _con.size() == 0;
23.     }
24. 
25.     size_t size() const
26.     {
27.       return _con.size();
28.     }
29.   private:
30.     Containers _con;
31.   };

三.模拟实现queue

队列和栈差不多,但队列是先进先出原则

源码

1. template<class T,class Containers=deque<T>>
2.  class queue   //队列
3.  {
4.  public:
5.    void push(const T&val)   //入队列,即尾插
6.    {
7.      _con.push_back(val);
8.    }
9. 
10.     void pop()   //出队列,即头删
11.     {
12.       _con.pop_front();
13.     }
14. 
15.     T& front()   //取队列的第一个元素
16.     {
17.       return _con.front();
18.     }
19. 
20.     const T& front() const
21.     {
22.       return _con.front();
23.     }
24. 
25.     bool empty()
26.     {
27.       return _con.size() == 0;
28.     }
29. 
30.     size_t size() const
31.     {
32.       return _con.size();
33.     }
34.   private:
35.     Containers _con;
36.   };

🐬🤖本篇文章到此就结束了, 若有错误或是建议的话,欢迎小伙伴们指出;🕊️👻

😄😆希望小伙伴们能支持支持博主啊,你们的支持对我很重要哦;🥰🤩

😍😁谢谢你的阅读。😸😼


目录
相关文章
|
5天前
|
存储 设计模式 C语言
C++中的栈和队列
C++中的栈和队列
11 0
|
5天前
|
调度 C++ 容器
【C++】手搓 list 容器
本文我们实现了STL库中重要的list 的模拟实现,其中最重要莫过于迭代器的封装类的书写,这是前所未有的操作(对于我来说,我是第一次使用这种结构)。通过list 的模拟实现也帮我们巩固了类与对象的知识,也强化了指针操作的思路。欢迎大家讨论分析。
14 1
|
5天前
|
存储 C++ 容器
【C++】vector容器初步模拟
我们初步完成了对vector 的模拟实现,但是依然有问题,比如不支持string等特殊类型。所以下一篇文章我们来一起完善一下。
15 0
【C++】vector容器初步模拟
|
5天前
|
设计模式 算法 编译器
【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
13 0
|
5天前
|
存储 设计模式 算法
【C++/STL】stack和queue(容器适配器、优先队列、双端队列)
【C++/STL】stack和queue(容器适配器、优先队列、双端队列)
16 1
|
5天前
|
存储 机器学习/深度学习 人工智能
c/c++线性表实现附源码(超详解)
c/c++线性表实现附源码(超详解)
17 0
|
5天前
|
存储 算法 C++
详解C++中的STL(标准模板库)容器
【4月更文挑战第30天】C++ STL容器包括序列容器(如`vector`、`list`、`deque`、`forward_list`、`array`和`string`)、关联容器(如`set`、`multiset`、`map`和`multimap`)和容器适配器(如`stack`、`queue`和`priority_queue`)。它们为动态数组、链表、栈、队列、集合和映射等数据结构提供了高效实现。选择合适的容器类型可优化性能,满足不同编程需求。
|
5天前
|
设计模式 安全 算法
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
19 0
|
3天前
|
测试技术 C++
C++|运算符重载(3)|日期类的计算
C++|运算符重载(3)|日期类的计算
|
5天前
|
C语言 C++ 容器
C++ string类
C++ string类
9 0