容器适配器

一、什么是适配器

容器适配器中的“适配器”,和生活中常见的电源适配器中“适配器”的含义非常接近。我们知道,无论是电脑、手机还是其它电器,充电时都无法直接使用 220V 的交流电,为了方便用户使用,各个电器厂商都会提供一个适用于自己产品的电源线,它可以将 220V 的交流电转换成适合电器使用的低压直流电。从用户的角度看,电源线扮演的角色就是将原本不适用的交流电变得适用,因此其又被称为电源适配器。

容器适配器也是同样的道理,就是将不适用的序列式容器(如vector、deque、list等)变得适用。通过封装某个序列式容器,并重新组合该容器的成员函数,使得其满足某些特定场景的需要。

容器适配器本质上还是容器,只不过此容器模板类的实现,利用了大量其它基础容器模板类中已经写好的成员函数。当然,如果必要的话,容器适配器中也可以自创新的成员函数。

二、容器适配器的种类

STL提供了3中容器适配器,分别为stack栈式适配器、queue队列适配器以及priority_queue优先权队列适配器。需要注意的是,STL中的容器适配器,其内部使用的基础容器并不是固定的,用户可以在满足特定条件的多个基础容器中自由选择。

容器适配器 基础容器筛选条件 默认使用的基础容器
stack

基础容器需要包含以下成员函数:

  • empty()
  • size()
  • back()
  • push_back()
  • pop_back()

满足条件的基础容器有vector、deque、list

deque
queue

基础容器需要包含以下成员函数:

  • empty()
  • size()
  • front()
  • back()
  • push_back()
  • pop_back()

满足条件的基础容器有deque、list

deque
priority_queue

基础容器需要包含以下成员函数:

  • empty()
  • size()
  • front()
  • push_back()
  • pop_back()

满足条件的基础容器有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 和 priority_queue 都定义在头文件 <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();  // 删除最高优先级元素
复制代码
创建 stack, queue, priority_queue 时都可以用一个顺序容器作为第二个类型参数,此外创建 priority_quque 时还可以额外传递第三个参数:一个函数对象来决定如何对 priority_queue 中的元素进行排序。
priority_queue 默认采用的是 less<Type> ,默认情况下 q.top() 是最大的元素,即大根堆。
posted @   我就是欧部  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示