文章目录
【 1. 基本原理 】 【 1. queue 的创建 】 2.1 使用默认的 deque 基础容器创建一个空的 queue 2.2 指定基础容器创建 queue 2.3 通过基础容器来初始化 queue 容器适配器 2.4 通过一个 queue 初始化另一个 queue
【 3. queue 支持的成员函数 】
【 1. 基本原理 】
STL queue 容器适配器 模拟的就是 队列 这种存储结构 ,因此对于任何需要用队列进行处理的序列来说,使用 queue 容器适配器都是好的选择。 和 stack 栈容器适配器不同,queue 容器适配器有 2 个开口, 其中一个开口专门用来输入数据,另一个专门用来输出数据 ,如下图所示。 这种存储结构最大的特点是,最先进入 queue 的元素,也可以最先从 queue 中出来,即用此容器适配器存储数据具有 先进先出(First In First Out,FIFO) 的特点,因此 queue 又称为队列适配器。
【 1. queue 的创建 】
queue 容器适配器以模板类 queue<T,Container=deque<T>>
(其中 T 为存储元素的类型,Container 表示底层容器的类型)的形式位于 <queue>头文件 中,并定义在 std 命名空间 里。
2.1 使用默认的 deque 基础容器创建一个空的 queue
创建一个可存储 int 类型元素,底层采用 deque 容器的 queue 容器适配器。
queue< int > values;
2.2 指定基础容器创建 queue
可以手动指定 queue 容器适配器底层采用的基础容器类型,基础容器存储的 数据类型 必须和 queue 容器适配器存储的元素类型保持一致 。
作为 queue 容器适配器的基础容器,其必须提供 front()、back()、push_back()、pop_front()、empty() 和 size() 这几个成员函数,符合条件的序列式容器仅有 deque 和 list。
queue< int , list< int >> values;
queue< int , deque< int >> values;
2.3 通过基础容器来初始化 queue 容器适配器
可以用基础容器来初始化 queue 容器适配器,只要该 基础容器类型和 queue 底层使用的基础容器类型相同 即可。例如:
由于 my_queue 底层采用的是 deque 容器,和 values 类型一致,且存储的也都是 int 类型元素,因此可以用 values 对 my_queue 进行初始化。
deque< int > values{ 1 , 2 , 3 } ;
queue< int > my_queue ( values) ;
2.4 通过一个 queue 初始化另一个 queue
还可以直接通过 queue 容器适配器来初始化另一个 queue 容器适配器,只要它们 存储的元素类型以及底层采用的基础容器类型相同 即可。例如:
deque< int > values{ 1 , 2 , 3 } ;
queue< int > my_queue1 ( values) ;
queue< int > my_queue ( my_queue1) ;
值得一提的是,第 3、4 种方法中 my_queue 容器适配器的数据是经过拷贝得来的,也就是说,操作 my_queue 容器适配器中的数据,并不会对 values 容器以及 my_queue1 容器适配器有任何影响;反过来也是如此。
【 3. queue 支持的成员函数 】
queue 容器适配器和 stack 有一些成员函数相似,但在一些情况下,工作方式有些不同。
queue 支持的成员函数 功能 empty() 如果 queue 中没有元素的话,返回 true。 size() 返回 queue 中元素的个数。 front() 返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。 back() 返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。 push(const T& obj) 在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。 emplace() 在 queue 的尾部直接添加一个元素。 push(T&& obj) 以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。 pop() 删除 queue 中的第一个元素。 swap(queue &other_queue) 将两个 queue 容器适配器中的元素进行互换,需要注意的是,进行互换的 2 个 queue 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。
queue 没有迭代器 ,因此访问元素的唯一方式是遍历容器,通过不断移除访问过的元素,去访问下一个元素 。实例
# include <iostream>
# include <queue>
# include <list>
using namespace std;
int main ( )
{
std:: deque< int > values{ 1 , 2 , 3 } ;
std:: queue< int > my_queue ( values) ;
cout << "size of my_queue: " << my_queue. size ( ) << endl;
while ( ! my_queue. empty ( ) )
{
cout << my_queue. front ( ) << endl;
my_queue. pop ( ) ;
}
return 0 ;
}