ALBEF跨模态学习:先对齐再融合的视觉语言模型
2026/7/22 8:03:01
stack——遵循后进先出(LIFO)规则的容器适配器,仅支持栈顶的插入、删除与访问操作;queue(队列):它和stack同属适配器容器,但核心规则是先进先出(FIFO),仅支持从队尾插入元素、从队头删除/访问元素,同样是基于底层序列容器封装的轻量级工具;queue的核心特性入手,详解它的定义、底层要求、常用接口的使用方法,并结合示例说明其典型应用场景,帮你掌握队列的核心使用技巧。我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的C++知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12880513.html?spm=1001.2014.3001.5482
C++官方queue文档
https://cplusplus.com/reference/queue/queue/
queue只会对外提供符合队列规则的成员函数来访问元素:元素从队尾完成入队操作,从队头完成出队操作,无法访问队列中间的元素。queue底层容器的类,需要至少支持以下操作:empty:检测容器是否为空size:返回容器中有效元素的个数front:返回容器首元素的引用back:返回容器尾元素的引用push_back:在容器尾部插入元素pop_front:在容器头部删除元素deque和list都满足这些要求。默认情况下,如果实例化queue时没有指定底层容器,会自动使用标准容器deque。queue的接口和stack一样非常精简,仅包含构造、判空、大小、队头/队尾访问、入队、出队这几个核心接口:
语法
queue<T>q;// T为存储的元素类型,默认底层容器为deque// 或指定底层容器:queue<T, Container> q;作用
示例
#include<queue>#include<iostream>#include<list>usingnamespacestd;intmain(){// 1. 默认构造(底层容器为deque)queue<int>q1;// 2. 指定底层容器为listqueue<int,list<int>>q2;cout<<"q1是否为空:"<<q1.empty()<<endl;// 输出:1(true)return0;}语法
boolempty()const;作用
true,否则返回false,时间复杂度O(1)。示例
queue<int>q;cout<<q.empty()<<endl;// 空队列,输出:1(true)q.push(10);cout<<q.empty()<<endl;// 非空队列,输出:0(false)语法
size_tsize()const;作用
size_t。示例
queue<int>q;q.push(1);q.push(2);q.push(3);cout<<"队列的大小:"<<q.size()<<endl;// 输出:3语法
// 普通版本:返回队头元素的引用(可修改)T&front();// const版本:返回队头元素的const引用(只读)constT&front()const;作用
示例
queue<int>q;q.push(10);q.push(20);// 普通版本:修改队头元素q.front()=100;cout<<"队头元素:"<<q.front()<<endl;// 输出:100// const版本:仅能读取constqueue<int>cq(q);cout<<"const队列的队头元素:"<<cq.front()<<endl;// 输出:100// cq.front() = 200; // 错误:const引用无法修改元素语法
// 普通版本:返回队尾元素的引用(可修改)T&back();// const版本:返回队尾元素的const引用(只读)constT&back()const;作用
返回队列中最后一个入队元素的引用,空队列调用back()会导致未定义行为。
示例
queue<int>q;q.push(10);q.push(20);// 普通版本:修改队尾元素q.back()=200;cout<<"队尾元素:"<<q.back()<<endl;// 输出:200语法
// 拷贝入队:将val拷贝到队尾voidpush(constT&val);// 原地构造(C++11):直接在队尾构造元素,避免拷贝template<class...Args>voidemplace(Args&&...args);作用
push_back()接口。queue<int>q;// 拷贝入队q.push(1);q.push(2);// 原地构造入队,效果等同于push(3),但效率更高q.emplace(3);cout<<"队尾元素:"<<q.back()<<endl;// 输出:3语法
voidpop();作用
删除队头的元素(仅执行删除操作,不会返回元素),底层调用底层容器的pop_front()接口;空队列调用pop()会导致未定义行为。
示例
queue<int>q;q.push(1);q.push(2);q.push(3);cout<<"出队前队头:"<<q.front()<<endl;// 输出:1q.pop();// 删除队头元素1cout<<"出队后队头:"<<q.front()<<endl;// 输出:2cout<<"出队后队列大小:"<<q.size()<<endl;// 输出:2queue没有迭代器,无法直接遍历,如果需要遍历队列,需要借助临时队列暂存元素,遍历完成后可以选择恢复原队列:
#include<queue>#include<iostream>usingnamespacestd;intmain(){// 1. 初始化队列并入队元素queue<int>q;q.push(10);q.push(20);q.push(30);q.push(40);// 2. 队列的基本属性cout<<"队列是否为空:"<<q.empty()<<endl;// 输出:0cout<<"队列的大小:"<<q.size()<<endl;// 输出:4cout<<"队头元素:"<<q.front()<<endl;// 输出:10cout<<"队尾元素:"<<q.back()<<endl;// 输出:40// 3. 模拟遍历队列(借助临时队列)queue<int>temp;cout<<"队列的元素(队头到队尾):";while(!q.empty()){intval=q.front();cout<<val<<" ";// 输出:10 20 30 40temp.push(val);q.pop();}cout<<endl;// 4. 恢复原队列while(!temp.empty()){q.push(temp.front());temp.pop();}cout<<"恢复后队列大小:"<<q.size()<<endl;// 输出:4return0;}| 对比维度 | queue(队列) | stack(栈) |
|---|---|---|
| 核心规则 | 先进先出(FIFO) | 后进先出(LIFO) |
| 操作位置 | 队尾入队、队头出队 | 栈顶入栈、栈顶出栈 |
| 访问接口 | front()(队头)、back()(队尾) | top()(栈顶) |
| 底层默认容器 | deque | deque |
| 遍历方式 | 需借助临时队列 | 需借助临时栈 |
| 典型应用 | BFS、任务排队 | 括号匹配、逆序处理 |
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的C++知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12880513.html?spm=1001.2014.3001.5482
| 非常感谢您的阅读,喜欢的话记得三连哦 |