一、容器适配器概念

queue 是标准模板库(STL)中的容器适配器,它基于其他底层容器实现队列数据结构,遵循先进先出(FIFO)原则。其模板声明为:

template <class T, class Container = deque<T>> 
class queue;

其中:

  • T:存储元素的类型
  • Container:底层容器类型(默认使用deque

二、底层容器选择

支持的容器要求

底层容器必须提供以下操作:

  • push_back()
  • pop_front()
  • front()
  • back()
  • empty()
  • size()
// 正确用法
queue<int, list<int>> queueList;  // ✅ list支持所有必需操作

// 错误用法 
queue<int, vector<int>> queueVec; // ❌ vector没有pop_front()
容器 可用性 原因
deque 默认适配容器
list 支持所有必需操作
vector 缺少高效pop_front()

三、队列核心操作

1. 元素存取

queue<int> q;

// 添加元素
q.push(1);    // 拷贝元素到队尾
q.emplace(2); // 直接构造元素(推荐用于自定义对象)

// 访问元素
q.front() = 10; // 修改队首元素(返回引用)
q.back() = 20;  // 修改队尾元素(返回引用)

// 移除元素
q.pop();        // 移除队首元素(无返回值)

2. 容量查询

cout << "元素数量: " << q.size();  // 获取队列长度
cout << "是否为空: " << q.empty(); // 判断空队列

四、完整代码解析

#include <iostream>
#include <queue>
#include <list>

using namespace std;

int main() {
    queue<int, list<int>> queueInt; // 使用list作为底层容器
    
    // 插入元素
    for(int i=1; i<=5; ++i){
        queueInt.push(i);
    }

    /* 修改元素值 */
    queueInt.front() = 66; // 修改队首
    queueInt.back() = 99;  // 修改队尾

    // 获取元素值
    int frontVal = queueInt.front();
    int backVal = queueInt.back();
    
    // 输出结果
    cout << "队首元素: " << frontVal << endl; // 输出66
    cout << "队尾元素: " << backVal << endl;  // 输出99
    
    // 容量操作
    if(!queueInt.empty()){
        cout << "队列长度: " << queueInt.size(); // 输出5
    }

    system("pause");
    return 0;
}

五、关键特性说明

  1. 元素访问

    • front()/back()返回引用,可直接修改元素值
    • 访问空队列的队首/队尾会导致未定义行为
  2. 插入操作对比

    方法 特点 适用场景
    push() 拷贝已有对象 基础类型
    emplace() 直接构造新对象(效率更高) 自定义类对象
  3. 性能特征

    • 所有操作时间复杂度:O(1)
    • 元素存储在连续内存(vector)或离散内存(list)

六、使用注意事项

  1. 容器选择原则

    • 需要频繁两端操作 → deque(默认最佳选择)
    • 需要大量中间操作 → list
  2. 线程安全性

    • STL容器非线程安全
    • 多线程环境需要自行加锁
  3. 异常处理

    • push()可能抛出内存分配异常
    • pop()操作前必须检查empty()
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐