容器适配器
一、什么是适配器
容器适配器中的“适配器”,和生活中常见的电源适配器中“适配器”的含义非常接近。我们知道,无论是电脑、手机还是其它电器,充电时都无法直接使用 220V 的交流电,为了方便用户使用,各个电器厂商都会提供一个适用于自己产品的电源线,它可以将 220V 的交流电转换成适合电器使用的低压直流电。从用户的角度看,电源线扮演的角色就是将原本不适用的交流电变得适用,因此其又被称为电源适配器。
容器适配器也是同样的道理,就是将不适用的序列式容器(如vector、deque、list等)变得适用。通过封装某个序列式容器,并重新组合该容器的成员函数,使得其满足某些特定场景的需要。
容器适配器本质上还是容器,只不过此容器模板类的实现,利用了大量其它基础容器模板类中已经写好的成员函数。当然,如果必要的话,容器适配器中也可以自创新的成员函数。
二、容器适配器的种类
STL提供了3中容器适配器,分别为stack栈式适配器、queue队列适配器以及priority_queue优先权队列适配器。需要注意的是,STL中的容器适配器,其内部使用的基础容器并不是固定的,用户可以在满足特定条件的多个基础容器中自由选择。
容器适配器 | 基础容器筛选条件 | 默认使用的基础容器 |
stack |
基础容器需要包含以下成员函数:
满足条件的基础容器有vector、deque、list |
deque |
queue |
基础容器需要包含以下成员函数:
满足条件的基础容器有deque、list |
deque |
priority_queue |
基础容器需要包含以下成员函数:
满足条件的基础容器有vector、deque |
vector |
三、初始化操作
可以直接使用一个deque来初始化stack和queue,但是不能使用无序的vector初始化priority_queue。
deque<int> deq; stack<int> sta(deq); // 用 deq 初始化 sta
如果要使用其他顺序容器实现适配器,要在创建适配器时用一个顺序容器作为第二个类型参数
stack<int, vector<int>> sta; // 定义基于 vector 实现的 stack
四、适配器操作
栈适配器:stack
s.pop(); // 删除栈顶元素,但不返回其值 s.push(item); // 在栈顶压入新元素item s.emplace(args); // 由 args 构造元素并压入栈顶 s.top(); // 返回栈顶元素的值,但不删除此元素 s.size(); // 返回stack元素个数 s.empty(); // 判空 swap(s, s2); s.swap(s2);
队列适配器:queue/priority_queue
queue<int> q; // priority_queue<int> q; q.empty(); // 判断队列是否为空 q.size(); // 返回队列长度 q.push(item); // 对于queue,在队尾压入一个新元素 // 对于priority_queue,在基于优先级的适当位置插入新元素 // queue only: q.front(); // 返回队首元素的值,但不删除该元素 q.back(); // 返回队尾元素的值,但不删除该元素 q.pop(); // 删除首元素 // priority_queue only: q.top(); // 返回具有最高优先级的元素值,但不删除该元素 q.pop(); // 删除最高优先级元素
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话