7.queue
- 一.queue简介
- 二.queue成员函数
- 1.q.push(x):入队,将元素 x 从队尾插入(尾插法)
- 2.q.pop():出队,删除对首元素,并返回其值
- 3.q.size():返回队中元素个数
- 4.q.front():返回对首元素
- 5.q.back():返回队尾元素
- 6.q.empty():判断是否为空(空返回 1,非空返回 0)
- 三.queue实例
- 1. 常见用法:
- 2. 任务调度:
- 3. 缓存:
- 4. 事件队列:
一.queue简介
- queue即“双端有序队列”, 是STL模板库中的一种先进先出(FIFO)的适配器(容器的封装),头文件:
<queue>
- 队列遵循先进先出的原则,只能在队的前端进行删除, 在队的后端进行插入。
- 队列内的元素不能访问。如果一定要访问队列内的元素,只能将前面元素全部从队前弹出,使之变成队首元素才可以。
- queue对象的默认构造形式:
queue<int>a;
- 优先队列
priority_queue
具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。
//升序队列
priority_queue <int,vector<int>,greater<int> > q;
//降序队列
priority_queue <int,vector<int>,less<int> >q; //默认
二.queue成员函数
1.q.push(x):入队,将元素 x 从队尾插入(尾插法)
2.q.pop():出队,删除对首元素,并返回其值
3.q.size():返回队中元素个数
4.q.front():返回对首元素
5.q.back():返回队尾元素
6.q.empty():判断是否为空(空返回 1,非空返回 0)
三.queue实例
1. 常见用法:
#include "pch.h"
#include <iostream>
#include <queue>
using namespace std;
//遍历打印队列(注:队列容器没有迭代器)
void print(queue<int>que) {
queue<int> tmp;
cout << "队首至队尾:" << endl ;
while (!que.empty()) { //打印队首元素,将其存入临时队列后,出队
cout << que.front() << " ";
tmp.push(que.front());
que.pop();
}
while (!tmp.empty()) { //将临时队列恢复至原队列
que.push(tmp.front());
tmp.pop();
}
cout << endl << endl;
}
int main(){
//构造队列
queue<int>que1;
for (int i = 0; i < 10; i++)
que1.push(i);
print(que1);
//拷贝构造队列
queue<int>que2(que1);
print(que2);
//赋值队列
queue<int>que3;
que3 = que1;
que3.pop(); //队首出队
que3.push(99); //99入队
print(que3);
cout << "que3.front()=" << que3.front() << endl;
cout << "que3.back()=" << que3.back() << endl;
cout << "que3.size()=" << que3.size() << endl;
}
2. 任务调度:
在任务调度中,Queue常常用于存储待执行的任务。下面是一个简单的例子:
#include <iostream>
#include <queue>
using namespace std;
void task1() {
cout << "任务1执行" << endl;
}
void task2() {
cout << "任务2执行" << endl;
}
int main() {
// 创建一个任务队列
queue<void (*)()> taskQueue;
// 将任务加入队列
taskQueue.push(task1);
taskQueue.push(task2);
// 依次执行任务
while (!taskQueue.empty()) {
auto task = taskQueue.front();
taskQueue.pop();
task();
}
return 0;
}
在上面的例子中,我们创建了一个任务队列 taskQueue,然后将两个任务 task1 和 task2 加入队列。在 while 循环中,我们依次从队列中取出任务并执行,直到队列为空。这样就实现了简单的任务调度功能。
3. 缓存:
在开发Web应用时,常常需要使用缓存来提高系统性能。下面是一个使用Queue实现缓存的例子:
#include <iostream>
#include <queue>
using namespace std;
const int CACHE_SIZE = 5; // 缓存大小为5
int main() {
queue<int> cache; // 创建一个缓存队列
// 模拟访问缓存
int data[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int i = 0; i < 10; i++) {
// 检查缓存是否已满
if (cache.size() == CACHE_SIZE) {
// 缓存已满,移除队首元素
cache.pop();
}
// 将数据添加到队尾
cache.push(data[i]);
// 输出当前缓存中的数据
cout << "当前缓存中的数据为: ";
while (!cache.empty()) {
cout << cache.front() << " ";
cache.pop();
}
cout << endl;
}
return 0;
}
当前缓存中的数据为: 1
当前缓存中的数据为: 1 2
当前缓存中的数据为: 1 2 3
当前缓存中的数据为: 1 2 3 4
当前缓存中的数据为: 1 2 3 4 5
当前缓存中的数据为: 2 3 4 5 6
当前缓存中的数据为: 3 4 5 6 7
当前缓存中的数据为: 4 5 6 7 8
当前缓存中的数据为: 5 6 7 8 9
当前缓存中的数据为: 6 7 8 9 10
在上面的例子中,我们使用Queue来实现了一个大小为5的缓存。在访问缓存时,我们先检查缓存是否已满,如果已满则移除队首元素。然后将数据添加到队尾,并输出当前缓存中的数据。
4. 事件队列:
在事件驱动的程序中,常常需要使用事件队列来管理事件。下面是一个使用Queue实现事件队列的例子:
#include <iostream>
#include <queue>
using namespace std;
int main() {
queue<string> event_queue; // 创建一个事件队列
// 模拟添加事件
event_queue.push("event1");
event_queue.push("event2");
event_queue.push("event3");
event_queue.push("event4");
// 处理事件队列中的事件
while (!event_queue.empty()) {
// 获取队首事件并处理
string event = event_queue.front();
cout << "处理事件: " << event << endl;
// 移除队首事件
event_queue.pop();
}
return 0;
}
处理事件: event1
处理事件: event2
处理事件: event3
处理事件: event4
这段代码是一个使用Queue实现事件队列的例子。在程序中,我们先创建了一个空的字符串队列event_queue,并向队列中添加了四个事件。然后,我们通过while循环依次处理队列中的事件,每次从队首获取一个事件并打印出来,然后将其从队列中移除。最后,当队列为空时退出循环,程序结束运行。