【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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MobiCetus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值