C++ queue
容器介绍
queue
是 C++ 标准库中的一个容器适配器,它实现了先进先出(FIFO)数据结构。即,元素按照插入的顺序排队,首先插入的元素最先出队。queue
适用于需要排队处理任务的场景,比如消息队列、任务调度等。
1. queue
的基本特性
- 先进先出(FIFO):
queue
实现了先进先出的特性。第一个进入队列的元素将会第一个被移除。 - 容器适配器:
queue
不是一个独立的容器类,而是基于其他容器(通常是deque
或list
)进行实现的容器适配器。 - 操作简洁:
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 deque
和 list
作为底层容器的比较
deque
:允许在队列两端快速插入和删除元素,且可以直接访问任意元素。deque
的队头和队尾操作非常高效,适合用于实现队列。list
:双向链表,虽然也能在两端进行高效的插入和删除操作,但不允许随机访问任何元素,因此性能上稍逊一筹。
4. queue
和 priority_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;
}