当前位置: 首页 > news >正文

【C++重点】deque

C++ queue 容器介绍

queue 是 C++ 标准库中的一个容器适配器,它实现了先进先出(FIFO)数据结构。即,元素按照插入的顺序排队,首先插入的元素最先出队。queue 适用于需要排队处理任务的场景,比如消息队列、任务调度等。

1. queue 的基本特性

  • 先进先出(FIFO)queue 实现了先进先出的特性。第一个进入队列的元素将会第一个被移除。
  • 容器适配器queue 不是一个独立的容器类,而是基于其他容器(通常是 dequelist)进行实现的容器适配器。
  • 操作简洁queue 提供了常见的队列操作,比如入队(push())、出队(pop())和访问队头元素(front())。

2. queue 的常见操作

2.1 构造与初始化

queue 默认使用 deque 容器作为底层实现,你也可以选择其他容器类型。

#include <iostream>
#include <queue>

int main() {
    // 默认构造
    std::queue<int> q;

    // 初始化时加入元素
    std::queue<int> q2;
    q2.push(10);
    q2.push(20);
    q2.push(30);

    std::cout << "Queue initialized with elements: ";
    while (!q2.empty()) {
        std::cout << q2.front() << " ";
        q2.pop();
    }
    std::cout << std::endl;

    return 0;
}

2.2 入队操作(push()

你可以使用 push() 方法将元素加入队列的尾部。

std::queue<int> q;
q.push(1);
q.push(2);
q.push(3);

2.3 出队操作(pop()

pop() 方法移除队头元素,但并不会返回被移除的元素。如果你想访问出队的元素,需要先使用 front() 获取它。

std::queue<int> q;
q.push(1);
q.push(2);
q.push(3);

// 移除队头元素
q.pop();
std::cout << "After pop, front element: " << q.front() << std::endl;  // 输出 2

2.4 访问队头元素(front()

front() 返回队头元素的引用。

std::queue<int> q;
q.push(1);
q.push(2);
q.push(3);

std::cout << "Front element: " << q.front() << std::endl;  // 输出 1

2.5 访问队尾元素(back()

back() 返回队尾元素的引用。

std::queue<int> q;
q.push(1);
q.push(2);
q.push(3);

std::cout << "Back element: " << q.back() << std::endl;  // 输出 3

2.6 检查队列是否为空(empty()

empty() 方法检查队列是否为空,返回一个布尔值。

std::queue<int> q;
if (q.empty()) {
    std::cout << "Queue is empty." << std::endl;
} else {
    std::cout << "Queue is not empty." << std::endl;
}

2.7 获取队列大小(size()

size() 方法返回队列中元素的数量。

std::queue<int> q;
q.push(1);
q.push(2);
q.push(3);

std::cout << "Queue size: " << q.size() << std::endl;  // 输出 3

3. queue 的底层实现

queue 是一个容器适配器,默认情况下,它使用 deque(双端队列)作为底层容器。deque 提供了在两端高效插入和删除元素的能力,因此适合用于队列的实现。
可以通过显式指定底层容器类型来创建 queue。例如,使用 list 作为底层容器:

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

int main() {
    std::queue<int, std::list<int>> q;
    q.push(1);
    q.push(2);
    q.push(3);

    std::cout << "Front element: " << q.front() << std::endl;  // 输出 1
    return 0;
}

3.1 dequelist 作为底层容器的比较

  • deque:允许在队列两端快速插入和删除元素,且可以直接访问任意元素。deque 的队头和队尾操作非常高效,适合用于实现队列。
  • list:双向链表,虽然也能在两端进行高效的插入和删除操作,但不允许随机访问任何元素,因此性能上稍逊一筹。

4. queuepriority_queue 的区别

  • queue:实现了先进先出的原则,适用于任务按顺序处理的场景。
  • priority_queue:实现了优先级队列,可以根据优先级对元素进行排序。优先级队列中的元素不是按插入顺序处理,而是根据优先级处理。

4.1 priority_queue 示例

#include <iostream>
#include <queue>

int main() {
    std::priority_queue<int> pq;
    pq.push(10);
    pq.push(5);
    pq.push(20);

    std::cout << "Top element in priority queue: " << pq.top() << std::endl;  // 输出 20
    pq.pop();
    std::cout << "Top element after pop: " << pq.top() << std::endl;  // 输出 10

    return 0;
}

需要优先处理元素时,可以考虑使用 priority_queue

#include <queue>
#include <iostream>

int main() {
    std::queue<int> q;
    q.push(10);
    q.push(20);
    q.push(30);

    // 查看队列中的元素
    while (!q.empty()) {
        std::cout << q.front() << " ";
        q.pop();
    }

    return 0;
}
http://www.dtcms.com/a/107497.html

相关文章:

  • linux内核漏洞检测利用exp提权
  • Echarts 地图下钻实现过程记录
  • Bootstrap 表格:高效布局与动态交互的实践指南
  • Java8 到 Java21 系列之 Lambda 表达式:函数式编程的开端(Java 8)
  • 深入剖析 Hive Fetch 抓取机制:原理、优化与实践
  • 【Axure元件分享】月份范围选择器
  • msvcr110.dll丢失的几种修复方法指南,msvcr110.dll是什么文件
  • 第四章、Isaacsim在GUI中构建机器人(2):组装一个简单的机器人
  • 10.使用路由缓存提升性能
  • DHT11数字温湿度传感器驱动开发全解析(下) | 零基础入门STM32第八十八步
  • emqx中LwM2M
  • 第七天 - re正则表达式模块 - 日志文件模式匹配 - 练习:Nginx日志分析器
  • 企业数据治理实践:“七剑” 合璧,释放数据价值
  • python string 类型字符拼接 +=的缺点,以及取代方法
  • python/pytorch杂聊
  • Nature旗下 | npj Digital Medicine | 图像+转录组+临床变量三合一,多模态AI预测化疗反应,值得复现学习的完整框架
  • 大智慧前端面试题及参考答案
  • 爬虫【feapder框架】
  • 【LeetCode基础算法】二叉树所有类型
  • ESLint语法报错
  • Mysql基础笔记
  • 论文:Generalized Category Discovery with Clustering Assignment Consistency
  • 获取各类基本因子
  • day21和day22学习Pandas库
  • Ray Flow Insight:让分布式系统调试不再“黑盒“
  • 【模型部署】onnx模型-LOOP 节点实例
  • 2.3.3 使用@Profile注解进行多环境配置
  • 高通将进军英国芯片 IP 业务 Alphawave
  • Qt线程等待条件QWaitCondition
  • 深入理解DRAM刷新机制:异步刷新为何无需扣除刷新时间?