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;  //默认

queueMQ怎么理解 queue it_队列

二.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;
}

queueMQ怎么理解 queue it_queue_02

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循环依次处理队列中的事件,每次从队首获取一个事件并打印出来,然后将其从队列中移除。最后,当队列为空时退出循环,程序结束运行。