请注意,本文尚未完成!您可以通过编辑此文档页面来提供帮助。
概述
- 简化
- 详细
template< class T, /* ... */ >
class queue;
template<
class T,
class Container = std::deque<T>
>
class queue;
队列是一个容器适配器——它通过提供新的接口来适配容器。
新接口是一种 FIFO(First In First Out,先进先出)数据结构。这意味着第一个被推入的元素是第一个被访问的元素(就像商店排队一样——第一个进入的人是第一个被服务的人)。
队列的技术定义
std::queue
类是一个容器适配器,它为程序员提供了队列的功能——特别是 FIFO(先进先出)数据结构。
类模板充当底层容器的包装器——只提供一组特定的函数。队列将元素推入底层容器的尾部,并从头部弹出元素。
std::queue
定义于 | 队列 |
模板参数
pub | T | 存储元素的类型。
危险 如果 |
pub | 容器 | 用于存储元素的底层容器类型。默认为 容器必须满足 SequenceContainer
标准容器 |
类型名称
pub | 容器类型 | 容器 |
pub | value_type | Container::value_type |
pub | size_type | Container::size_type |
pub | reference | Container::reference |
pub | const_reference | Container::const_reference |
成员函数
pub | (构造函数) | 构造一个 |
pub | (析构函数) | 销毁一个 |
pub | operator= | 将一个队列赋值给另一个队列。 |
元素访问
pub | front | 访问顶部元素(第一个推入的)。 |
pub | 末尾 | 访问尾部元素(最后一个推入的)。 |
容量
pub | empty | 如果队列为空,返回 true ,否则返回 false 。 |
pub | size | 返回队列中的元素数量。 |
修饰符
pub | push | 在末尾插入一个新元素。 |
pub | emplace (C++11 起) | 在末尾就地构造一个新元素。 |
pub | pop | 移除第一个推入的元素(即 queue.front() 将返回的元素)。 |
pub | swap (自 C++11 起) | 交换两个队列。 |
成员对象
保护 | Container C | 底层容器。默认为 std::deque<T> 。 |
非成员函数
pub | operator== operator!= operator< operator> operator<= operator>= operator<=> (C++20) | 按字典顺序比较队列中的值。 |
pub | std::swap (std::queue) | std::swap 算法的重载。 |
辅助类
pub | std::uses_allocator (std::queue) | 特化 std::uses_allocator 类型特征。 |
推导指南 (C++17 起)
点击展开
// (1)
template< class Container >
queue( Container )
-> queue<typename Container::value_type, Container>;
// (2)
template< class Container, class Alloc >
queue( Container, Alloc )
-> queue<typename Container::value_type, Container>;
(1)
和(2)
允许从底层容器类型推导
(2)
使用 std::deque<typename std::iterator_traits<InputIt>::value_type>
作为底层容器类型(见(4)
)
// (3) (since C++23)
template< class InputIt >
queue( InputIt, InputIt )
-> queue<typename std::iterator_traits<InputIt>::value_type>;
// (4) (since C++23)
template< class InputIt, class Alloc >
queue( InputIt, InputIt, Alloc )
-> queue<typename std::iterator_traits<InputIt>::value_type,
std::deque<typename std::iterator_traits<InputIt>::value_type, Alloc>>;
(3)
和(4)
允许从迭代器范围推导
重载决议
为了使任何推导指南参与重载决议,必须满足以下要求
InputIt
满足LegacyInputIterator
Container
不满足Allocator
- 对于
(2)
(直到 C++23)和(4)
(从 C++23 开始),Alloc
满足Allocator
- 如果
Container
和Alloc
都存在,则std::uses_allocator_v<Container, Alloc>
为 true。
库确定类型不满足 LegacyInputIterator
的程度是未指定的,但至少
- 整型不符合输入迭代器的条件。
同样,它确定类型不满足 Allocator
的程度是未指定的,但至少
- 成员类型
Alloc::value_type
必须存在。 - 当作为未求值操作数处理时,表达式
std::declval<Alloc&>().allocate(std::size_t{})
必须是格式良好的。
示例
基本操作
#include <iostream>
#include <queue>
int main()
{
std::priority_queue<int> q;
queue.push(1);
queue.push(2);
queue.push(3);
while (!queue.empty()) {
std::cout << queue.top() << '\n';
queue.pop();
}
}
1
2
3