C++之queue类的代码及其逻辑详解

C++之queue类的代码及其逻辑详解

1. queue介绍及使用方法

queue 是 C++ 标准模板库(STL)中的容器适配器,遵循先进先出(FIFO)原则。它基于其他容器(如 deque 或 list)实现,仅允许在队尾插入元素,在队头删除元素。



stack的底层是一个 deque<T>(双端队列),虽然deque是可以从两端来进行操作的,但是我们只要只提供一端的接口,那么就可以来把它当做stack来使用。



因为queue需要支持高效的 “队尾插入”(push)和 “队头删除”(pop)操作,而dequepush_back(尾插)和pop_front(头删)操作均能在常数时间内完成,且无需像vector那样在头删时移动大量元素,也无需像list那样维护额外的指针开销,综合性能更优。

2. queue的常用函数

函数名函数作用
void push(const T& x)在尾巴部插入元素
void pop()抛出一个头部元素
T& front()返回头部元素
T& back()返回尾部元素
size_t size()返回队列的大小
bool empty()判断是否为空,为空就返回true

3. template

在这里写两个calss是为了方便使用,这两个模板参数实际上是各司其职,只是语法上要求写在同一个 template<> 里,使用时会根据场景自动匹配对应的参数。

前面的 T 是明确指定栈中元素的类型(比如 intstring 等),这是栈对外提供的 “数据类型契约”—— 栈里只能存 T 类型的东西。后面的 Container 是指定用什么容器来存储这些 T 类型的元素,而默认的 deque<T> 就是 “用双端队列来存 T 类型元素” 的意思。

PS:只写后面那一个理论上来说也是可以的,但是会让用户使用门槛变高,比如想声明一个存 int 的栈,用户不能直接写 stack<int>,而必须写成 stack<deque<int>>(如果想用默认容器),或者 stack<vector<int>>。这会让接口变得不直观 —— 用户需要先知道底层容器的类型,才能正确声明栈,违背了 “栈是容器适配器,用户无需关心底层实现” 的设计初衷。

PS:只写前面哪一个是不行的,如果只写 template<class T>,就意味着用户无法指定底层容器了 —— 因为没有 Container 这个参数来接收用户自定义的容器类型。

template<class T, class Container = deque<T>>

4. private

这就是申明一个私有成员_con。

private: Container _con;

5.pop()

抛出队头,因为队列是先进先出的。

void pop() { _con.pop_front(); }

6. front()

返回队头元素。

PS:这边使用T&是为了调用者可以直接修改队列中真正的队头元素,避免不必要的拷贝开销。

T& front() { return _con.front(); }

7. back()

返回队尾元素。

队列是先进先出,但是在很多场景下,除了需要知道 “最早入队的元素”(队头,front()),还可能需要获取 “最新入队的元素”(队尾)。

back()只是“读取” 队尾元素,不会修改队列的结构或元素顺序,因此不会破坏其核心逻辑。

T& back() { return _con.back(); }

8. size()

通过调用双端队列的size()来返回队列size的大小。

size_t size() { return _con.size(); }

9. empty()

判断是否为空,为空就返回true。

bool empty() { return _con.empty(); }

10. push()

在队列尾部插入一个元素。

void push(const T& x) { _con.push_back(x); }

11. 总结

综上,queue凭借简洁的接口、高效的底层实现,成为处理顺序依赖场景的理想选择。理解其基于deque的适配逻辑,能帮助开发者更合理地运用队列解决实际问题。

以下是queue的完整代码:

template<class T, class Container = deque<T>> class queue { public: void push(const T& x) { _con.push_back(x); } void pop() { _con.pop_front(); //_con.erase(_con.begin()); } T& front() { return _con.front(); } T& back() { return _con.back(); } size_t size() { return _con.size(); } bool empty() { return _con.empty(); } private: Container _con; }; 

Read more

前端人拿不到offer,九成是不知道这个新风向

今年大部分互联网公司面试的题目已经开始小部分八股文,大部分场景题了,公司需要的不仅是知识扎实,而且招进来就能上手项目的面试者… 2026最新高频场景题 * 1. 请求失败会弹出一个toast,如何保证批量请求失败,只弹出一个toast * 2. 如何减少项目里面if-else * 3. babel-runtime 作用是啥 * 4. 如何实现预览PDF文件 * 5. 如何在划词选择的文本上添加右键菜单(划词:鼠标滑动选择一组字符,对组字符进行操作) * 6. 富文本里面,是如何做到划词的(鼠标滑动选择一组字符,对组字符进行操作)? * 7. 如何做好前端监控方案 * 8. 如何标准化处理线上用户反馈的问题 * 9. px如何转为rem * 10. 浏览器有同源策略,但是为何 cdn 请求资源的时候不会有 跨域限制 * 11. cookie可以实现不同域共享吗 * 12. axios是否可以取消请求 * 13. 前端如何实现折叠面板效果? * 14. dom里面,如何判定a元素是否是b元素的子元 * 15. 判断一个对象是否为空,包含了其原型链上是否有自

By Ne0inhk
哈希的介绍

哈希的介绍

1. unordered系列关联式容器     下面来看哈希,首先看关联式容器unorder_map和unorder_set,它们底层是哈希表,用法和map set一样。下面浅浅过一下,它是单向迭代器,因为没有rbegin和rend。也就是红黑树和哈希表实现的map和set用法几乎相同,区别是:1.unorder系列是单向迭代器。2.unorder系列遍历出来不是有序的。下面演示一下: 它只能去重,不能排序,它也是有multi版本的。再演示一下unorder_map: 2.哈希     下面正式看哈希,什么是哈希呢?我们以前遇到的搜索有这样几类:首先是暴力查找,在一个数组里都查,这样非常慢。于是有人衍生出了有序数组的二分查找,但它的前提是排序,而且增删查改不方便,过程中为了保证有序会涉及大量的数据挪动。因此衍生出了平衡搜索树,此时基础上又出现了新的搜索,这种搜索叫哈希(散列)。它的本质是存储的值跟存储位置建立出一个映射关系,什么意思呢,先来看一个计数排序的样例: 有上面这样的一组值,最小的值是15,最大的值是30,总共开了16个空间。然后存映射关系(次数),15映射第一个位

By Ne0inhk
Wfuzz 全面使用指南:Web 应用模糊测试工具详解

Wfuzz 全面使用指南:Web 应用模糊测试工具详解

Wfuzz 是一款功能强大的开源 Web 应用模糊测试(Fuzzing)工具,主要用于自动化发现 Web 应用中的隐藏资源、注入漏洞、目录遍历等问题。它由 Python 编写,支持多种 payload(有效载荷)注入方式,能够对 HTTP 请求的各个部分进行暴力破解或模糊测试,包括 URL 路径、GET/POST 参数、Cookie、HTTP 头、认证信息等。Wfuzz 的设计理念是模块化和可扩展性强,适合渗透测试人员、安全研究员和开发人员用于 Web 安全评估。 Wfuzz 的核心机制是通过在目标 URL 或请求中用特殊的占位符(如 FUZZ、FUZ2Z 等)标记需要模糊测试的位置,然后用指定的 payload 列表逐一替换这些占位符,发送

By Ne0inhk

不用写复杂前端,5 分钟上线 AI 模型交互界面:Gradio 安装使用全攻略 + 特性与适用场景解析

【个人主页:玄同765】 大语言模型(LLM)开发工程师|中国传媒大学·数字媒体技术(智能交互与游戏设计) 深耕领域:大语言模型开发 / RAG知识库 / AI Agent落地 / 模型微调 技术栈:Python / LangChain/RAG(Dify+Redis+Milvus)| SQL/NumPy | FastAPI+Docker ️ 工程能力:专注模型工程化部署、知识库构建与优化,擅长全流程解决方案         专栏传送门:LLM大模型开发 项目实战指南、Python 从真零基础到纯文本 LLM 全栈实战、 从零学 SQL + 大模型应用落地、大模型开发小白专属:从 0 入门 Linux&Shell       「让AI交互更智能,让技术落地更高效」 欢迎技术探讨/项目合作!

By Ne0inhk