C++ 任务队列简介
任务队列(queue)是编程中一种基础的数据结构,它遵循 FIFO(先进先出) 原则:第一个添加的元素将第一个被取出。想象一下商店里的普通队列——第一位顾客首先被服务。在 C++ 中,队列操作通过容器 std::queue 实现,它是标准模板库(STL)的一部分。
在本文中,我们将详细讲解如何在 C++ 中创建、填充和处理任务队列。您将了解有哪些可用方法,如何避免常见错误,以及队列如何在从多线程系统到请求处理的实际项目中应用。
队列的基本操作
创建和初始化队列
要在 C++ 中使用队列,需要包含头文件 <queue>。基本队列声明如下:
#include <iostream>#include <queue>
int main() { std::queue<int> taskQueue; // 整数队列 return 0;}您可以为任何数据类型创建队列——字符串、自定义结构、指针。例如,用于处理订单的任务队列:
#include <queue>#include <string>
struct Order { int id; std::string description;};
int main() { std::queue<Order> orderQueue; return 0;}添加和删除元素
队列操作的主要方法:
push()— 在队列末尾添加元素pop()— 删除队列中的第一个元素front()— 返回第一个元素的引用(不删除)back()— 返回最后一个元素的引用empty()— 检查队列是否为空size()— 返回元素数量
来看一个逐步处理任务的示例:
#include <iostream>#include <queue>
int main() { std::queue<std::string> tasks;
// 添加任务 tasks.push("任务 1:检查邮件"); tasks.push("任务 2:撰写报告"); tasks.push("任务 3:召开会议");
std::cout << "第一个任务:" << tasks.front() << std::endl; std::cout << "最后一个任务:" << tasks.back() << std::endl; std::cout << "任务总数:" << tasks.size() << std::endl;
// 按顺序处理任务 while (!tasks.empty()) { std::cout << "正在执行:" << tasks.front() << std::endl; tasks.pop(); // 删除已完成的任务 }
std::cout << "所有任务已完成!" << std::endl; return 0;}执行结果:
第一个任务:任务 1:检查邮件最后一个任务:任务 3:召开会议任务总数:3正在执行:任务 1:检查邮件正在执行:任务 2:撰写报告正在执行:任务 3:召开会议所有任务已完成!优先队列:当顺序很重要时
有时任务具有不同的优先级。例如,关键错误应该比计划更新更早处理。在这种情况下,使用 std::priority_queue,它会自动按优先级对元素进行排序。
#include <iostream>#include <queue>#include <vector>
int main() { // 默认情况下——最大元素具有最高优先级 std::priority_queue<int> highPriorityTasks;
highPriorityTasks.push(5); // 普通任务 highPriorityTasks.push(10); // 紧急任务 highPriorityTasks.push(1); // 低优先级
while (!highPri