std::queue
是 C++ 标准库中的一种容器适配器,用于实现先进先出(FIFO)的队列数据结构。类似于 std::stack
,std::queue
也是对其他容器的封装,并提供队列的接口。
1. 底层实现
std::queue
并不是一个独立的数据结构,而是基于其他序列容器来实现的,默认情况下使用 std::deque
(双端队列)作为其底层容器。std::deque
提供了在两端插入和删除元素的高效操作,非常适合用于实现队列。
自定义实现
- 默认容器:
std::queue
默认使用std::deque
作为底层容器。 - 可选容器:你也可以选择使用
std::list
作为底层容器。使用std::vector
作为底层容器不常见,因为std::vector
在头部插入元素的效率较低。
你可以在定义 std::queue
时指定使用的底层容器:
std::queue<int, std::list<int>> queueWithList;
2. 常用成员函数
std::queue
提供了基本的队列操作函数,符合 FIFO 原则:
构造函数
queue()
:创建一个空队列。queue(const Container& cont)
:使用指定的容器cont
初始化队列。
元素访问
front()
:返回队列中第一个元素的引用,即队列头部的元素。back()
:返回队列中最后一个元素的引用,即队列尾部的元素。
容量
empty()
:检查队列是否为空。如果队列为空,返回true
;否则返回false
。size()
:返回队列中元素的个数。
修改
push(const T& value)
:将元素value
插入到队列尾部。pop()
:移除队列头部的元素,但不会返回该元素。emplace(Args&&... args)
:在队列尾部直接构造元素。它比push
更高效,因为可以避免临时对象的创建。
3. 具体操作示例
以下是一个使用 std::queue
的简单示例:
#include <iostream>
#include <queue>
int main() {
// 使用默认的 deque 作为底层容器
std::queue<int> queue;
// 将元素插入队列
queue.push(10);
queue.push(20);
queue.push(30);
std::cout << "Queue size: " << queue.size() << std::endl;
std::cout << "Front element: " << queue.front() << std::endl;
std::cout << "Back element: " << queue.back() << std::endl;
// 移除队列头部元素
queue.pop();
std::cout << "Front element after pop: " << queue.front() << std::endl;
// 判断队列是否为空
while (!queue.empty()) {
std::cout << "Popping element: " << queue.front() << std::endl;
queue.pop();
}
return 0;
}
4. 总结
- 底层实现:
std::queue
是一个容器适配器,默认使用std::deque
作为底层容器。你也可以选择std::list
作为底层容器。 - 主要操作:
std::queue
提供了push
、pop
、front
、back
、empty
和size
等操作,用于管理队列中的元素和检查队列的状态。 - 适用场景:
std::queue
适用于需要 FIFO 行为的数据结构,如任务调度、广度优先搜索等。