C++ std::queue 队列指南

概述

std::queue 是 C++ 标准库中的容器适配器,实现先进先出 (FIFO) 数据结构。默认基于 std::deque 实现,也可使用 std::list 作为底层容器。

1. 包含头文件

#include <queue>

2. 声明与初始化

// 默认初始化(使用 deque)
std::queue<int> myQueue; 

// 指定底层容器为 list
std::queue<std::string, std::list<std::string>> listQueue;

3. 核心操作

元素入队 (push())

std::queue<int> q;
q.push(10);  // 队列: [10]
q.push(20);  // 队列: [10, 20]
q.push(30);  // 队列: [10, 20, 30]

元素出队 (pop())

q.pop();  // 移除队首元素 → 队列: [20, 30]

访问队首元素 (front())

int front = q.front();  // 返回 20(不移除)

访问队尾元素 (back())

int back = q.back();  // 返回 30

检查队列状态

操作 示例 说明
判空 if (q.empty()) { /*...*/ } 队列为空返回 true
获取大小 size_t count = q.size(); 返回元素数量

4. 使用示例

#include <iostream>
#include <queue>

int main() {
    std::queue<std::string> taskQueue;
    
    // 添加任务
    taskQueue.push("Process data");
    taskQueue.push("Send report");
    taskQueue.push("Cleanup resources");
    
    std::cout << "Tasks in queue: " << taskQueue.size() << "\n";
    
    // 处理所有任务
    while (!taskQueue.empty()) {
        std::cout << "Executing: " << taskQueue.front() << "\n";
        taskQueue.pop();
    }
    
    std::cout << "All tasks completed!\n";
    return 0;
}

5. 队列特性对比

std::queue vs 数组实现队列

特性 std::queue 数组实现队列
内存管理 自动处理内存分配 需手动管理内存
扩容机制 动态扩容 固定大小或需手动扩容
并发安全 非线程安全
底层实现 基于 deque/list 基于原始数组
边界检查 内置安全检测 需手动实现检查
代码复杂度 低(标准库实现) 高(需自行实现)

std::queue vs std::deque

特性 std::queue std::deque
访问模式 仅限 FIFO 操作 支持随机访问
接口复杂度 简单(6个方法) 复杂(多种操作)
使用场景 严格 FIFO 需求 需双端操作/随机访问
性能 适配器层轻微开销 直接操作最优

6. 最佳实践

  1. 选择底层容器

    • 默认使用 std::deque(综合性能好)
    • 频繁小数据操作考虑 std::list
    std::queue<int, std::list<int>> listBasedQueue;
    
  2. 安全访问

    // 先检查再访问
    if (!myQueue.empty()) {
        auto value = myQueue.front();
        myQueue.pop();
    }
    
  3. 遍历队列(非破坏性):

    std::queue<int> temp = myQueue;
    while (!temp.empty()) {
        std::cout << temp.front() << " ";
        temp.pop();
    }
    
  4. 错误处理

    try {
        if (myQueue.empty()) 
            throw std::runtime_error("Accessing empty queue");
        // 安全操作...
    } catch (const std::exception& e) {
        std::cerr << "Error: " << e.what() << std::endl;
    }
    

复杂度分析

操作 时间复杂度 说明
push() O(1) 常量时间插入
pop() 常量时间移除
front()/back() 常量时间访问
size()/empty() 常量时间查询

应用场景:任务调度、消息处理系统、BFS 算法、缓冲区管理、打印队列等需要 FIFO 机制的场合。

0 条评论

目前还没有评论...