news 2026/6/15 13:20:11

C++ STL | 容器适配器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ STL | 容器适配器

C++ STL 中的容器适配器(Container Adapters)

容器适配器是基于现有的 STL 容器(序列容器或关联容器)通过限制接口改变语义来实现特定数据结构的一种“适配”方式。

它们本身不是独立的容器,而是对已有容器的封装,提供了受限的、更专一的接口。

C++ STL 中目前存在的三种主要容器适配器(C++11~C++20)

容器适配器底层默认容器主要接口特点典型用途是否支持比较运算符是否可自定义底层容器
stackdeque只允许栈顶操作(push/pop/top)后进先出(LIFO)是(C++20起)
queuedeque队首出、队尾进(push/pop/front/back)先进先出(FIFO)是(C++20起)
priority_queuevector+ 大顶堆只能访问/弹出队首(最大/最小元素)优先级队列(默认最大堆)

一、详细对比表(包含常用操作的时间复杂度)

容器适配器|底层默认容器|压入元素|弹出元素|访问顶/首元素|判空/大小|遍历方式|随机访问---------------|----------------|--------------|--------------|---------------|-----------|------------------|-----------stack<T>|deque|push()O(1)|pop()O(1)|top()O(1)|empty()/size()|不支持遍历|不支持 queue<T>|deque|push()O(1)|pop()O(1)|front()O(1)|empty()/size()|不支持遍历|不支持 priority_queue|vector+heap|push()O(log n)|pop()O(log n)|top()O(1)|empty()/size()|不支持遍历|不支持

二、最常用写法与自定义底层容器示例

#include<iostream>#include<stack>#include<queue>#include<vector>#include<deque>#include<list>// 1. 普通使用std::stack<int>s;// 默认用 dequestd::queue<int>q;// 默认用 dequestd::priority_queue<int>pq;// 默认 vector + 大顶堆// 2. 常用小技巧 - 最小堆(最常用写法)std::priority_queue<int,std::vector<int>,std::greater<int>>minHeap;// 3. 完全自定义底层容器std::stack<int,std::vector<int>>stack_vec;// 用 vector 做栈(不推荐,效率较低)std::stack<int,std::deque<int>>stack_deque;// 最常用组合(默认)std::stack<int,std::list<int>>stack_list;// 可以,但不常见std::queue<int,std::list<int>>queue_list;// 合法,但效率通常不如 deque// 4. priority_queue 最常见的几种写法usingpii=std::pair<int,int>;// 最大堆(默认)std::priority_queue<int>max_pq;// 最小堆(最常用写法)std::priority_queue<int,std::vector<int>,std::greater<>>min_pq;// 自定义比较器 - 按 pair 第一元素从小到大,相同则第二元素从大到小autocmp=[](constpii&a,constpii&b){if(a.first!=b.first)returna.first>b.first;// 小顶堆returna.second<b.second;// 第二关键字大顶};std::priority_queue<pii,std::vector<pii>,decltype(cmp)>pq_custom(cmp);

三、容器适配器重要特性总结(面试/笔试高频)

  1. 都没有clear()erase()insert()等普通容器接口
  2. 都没有迭代器!(不能遍历)
  3. 都没有begin()/end()/rbegin()
  4. priority_queue唯一默认不保证先进先出的
  5. priority_queue不提供pop()返回值的接口(与 Java 不同)
  6. stackqueue在 C++20 之后支持了operator==operator<=>(需底层容器也支持)
  7. 改变底层容器不会改变时间复杂度(除了 priority_queue 的底层必须是随机访问容器)

四、常见面试/笔试陷阱题速览

// 下面哪些是合法的?(多选)A.std::stack<int>::iterator it;// × 没有迭代器B.std::priority_queue<int>pq;pq.clear();// × 没有 clear()C.std::queue<int>q;q.push(1);q.pop();// √D.std::priority_queue<int>pq;pq.emplace(42);// √(C++11)E.std::stack<int,std::vector<int>>s;s.top()=10;// × top()返回const引用(const T&)F.autopq=std::priority_queue<int>{1,2,3};// × 没有这种初始化方式G.std::priority_queue<int>pq{1,3,2};// × 同上

正确答案:只有 C、D 合法

希望这份总结对你理解和使用 STL 容器适配器有帮助!

需要更深入的某个适配器实现原理、源码剖析、还是性能对比测试用例吗?可以继续问~ 😄

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 16:59:50

PMP知识--十大知识域(下)

六 项目资源管理规划资源管理&估算活动资源规划资源管理估算活动资源获取资源&建设团队获取资源建设团队塔克曼阶梯理论&#xff08;重点&#xff09;建设团队的工具与技术管理团队&控制资源管理团队冲突管理情商控制资源七 项目沟通管理概述&规划沟通管理概述…

作者头像 李华
网站建设 2026/6/5 10:59:21

基于Spring Boot的酒店管理系统_n4w99n6v-java毕业设计

目录摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 该系统基于Spring Boot框架开发&#xff0c;旨在为酒店行业提供高效、智能化的管理解决方案。采用B/S架构&#xff0c…

作者头像 李华
网站建设 2026/6/13 5:54:52

随想-关于光速极限

其实说到这里&#xff0c;为啥不能超过光速&#xff0c;这事已经没啥可说的了。答案就是不为啥&#xff0c;也没有说宇宙把速度限制到了光速。其实放下各种复杂的理论不谈&#xff0c;就只是说这个想法&#xff0c;是不是有点自大。宇宙之大无奇不有&#xff0c;为啥非得去限制…

作者头像 李华
网站建设 2026/6/15 12:51:48

unity 资源导入 godot

文章目录 unity 资源导入 godot 大多数你有权限就行&#xff0c;比如免费商店 对于2D 游戏手工搬运 texture 就行&#xff0c;也有Unidot Importer这样的工具&#xff08;GameFromScratch的视频介绍&#xff09;不过适合项目迁移&#xff0c;自己搞的话自己搭建最好 主要是 uni…

作者头像 李华
网站建设 2026/6/15 12:52:46

Redis:Redis键值淘汰策略

文章目录键值淘汰策略使用 maxmemory 配置指令为复制或持久化实例设置 maxmemory淘汰策略使用 INFO 命令近似 LRU 算法LFU 淘汰键值淘汰策略 Redis 常被用作缓存&#xff0c;以加速对较慢服务器或数据库的读取访问。由于缓存条目是持久存储数据的副本&#xff0c;当缓存内存不…

作者头像 李华
网站建设 2026/6/15 12:52:22

CC工具箱使用指南:【遍历图斑】

一、简介 之前做过一个遍历图斑的工具&#xff1a; 有点过于简陋了。 主要平时自己也不用&#xff0c;就没去动它。 最近看好几个小伙伴都做了类似的工具&#xff0c;功能很完善。 于是这个工具看着就有点碍眼&#xff0c;优化一下吧。 旧工具将会移除&#xff0c;要用就用…

作者头像 李华