C++ STL queue容器适配器详解
和 stack 栈容器适配器不同,queue 容器适配器有 2 个开口,其中一个开口专门用来输入数据,另一个专门用来输出数据,如图 1 所示。

图 1 queue容器适配器
这种存储结构的特点是,进入 queue 的元素,也可以从 queue 来,即用此容器适配器存储数据具有“先进先出(简称 "FIFO" )”的特点,因此 queue 又称为队列适配器。
其实,STL queue 容器适配器模拟的就是队列这种存储结构,因此对于任何需要用队列进行处理的序列来说,使用 queue 容器适配器都是好的选择。
queue容器适配器的创建
queue 容器适配器以模板类 queue<T,Container=deque<T>>(其中 T 为存储元素的类型,Container 表示底层容器的类型)的形式位于<queue>头文件中,并定义在 std 名空间里。因此,在创建该容器之前,程序中应包含以下 2 行代码:创建 queue 容器适配器的方式大致可分为以下几种。#include <queue>
using namespace std;
1) 创建一个空的 queue 容器适配器,其底层使用的基础容器选择默认的 deque 容器:
通过此行代码,就可以成功创建一个可存储 int 类型元素,底层采用 deque 容器的 queue 容器适配器。std::queue<int> values;
2) 当然,也可以手动指定 queue 容器适配器底层采用的基础容器类型。通过学习 《STL容器适配器详解》一节我们知道,queue 容器适配器底层容器可以选择 deque 和 list。
作为 queue 容器适配器的基础容器,其必须提供 front()、back()、push_back()、pop_front()、empty() 和 size() 这几个成员函数,符条件的序列式容器仅有 deque 和 list。
例如,下面创建了一个使用 list 容器作为基础容器的空 queue 容器适配器:
注意,在手动指定基础容器的类型时,其存储的数据类型必须和 queue 容器适配器存储的元素类型保持一致。std::queue<int, std::list<int>> values;
3) 可以用基础容器来初始化 queue 容器适配器,只要该容器类型和 queue 底层使用的基础容器类型相同即可。例如:
由于 my_queue 底层采用的是 deque 容器,和 values 类型一致,且存储的也都是 int 类型元素,因此可以用 values 对 my_queue 进行初始化。std::deque<int> values{1,2,3};
std::queue<int> my_queue(values);
4) 还可以直接通过 queue 容器适配器来初始化另一个 queue 容器适配器,只要它们存储的元素类型以及底层采用的基础容器类型相同即可。例如:
std::deque<int> values{1,2,3};
std::queue<int> my_queue1(values);
std::queue<int> my_queue(my_queue1);
//或者使用
//std::queue<int> my_queue = my_queue1;
值得一提的是,第 3、4 种初始化方法中 my_queue 容器适配器的数据是经过拷贝得来的,也就是说,操作 my_queue 容器适配器中的数据,并不会对 values 容器以及 my_queue1 容器适配器有任何影响;反过来也是如此。注意,和使用基础容器不同,使用 queue 适配器给另一个 queue 进行初始化时,有 2 种方式,使用哪一种都可以。
queue容器适配器支持的成员函数
queue 容器适配器和 stack 有一些成员函数相似,但在一些情况下,工作方式有些不同。表 2 罗列了 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<T> &other_queue) | 将两个 queue 容器适配器中的元素进行互换,需要注意的是,进行互换的 2 个 queue 容器适配器中存储的元素类型以及底层采用的基础容器类型,都必须相同。 |
下面这个例子中演示了表 2 中部分成员函数的用法:和 stack 一样,queue 也没有迭代器,因此访问元素的方式是遍历容器,通过不断移除访问过的元素,去访问下一个元素。
#include <iostream>
#include <queue>
#include <list>
using namespace std;
int main()
{
//构建 queue 容器适配器
std::deque<int> values{ 1,2,3 };
std::queue<int> my_queue(values);//{1,2,3}
//查看 my_queue 存储元素的个数
cout << "size of my_queue: " << my_queue.size() << endl;
//访问 my_queue 中的元素
while (!my_queue.empty())
{
cout << my_queue.front() << endl;
//访问过的元素出队列
my_queue.pop();
}
return 0;
}
运行结果为:
size of my_queue: 3
1
2
3
表 2 中其它成员函数的用法也非常简单,这里不再给出具体示例,后续章节用做具体介绍。
- 随机文章
- 杭州--马尔代夫(杭州首条直飞马尔代夫航线开通)
- 中国 马尔代夫 场地价格(中国马尔代夫场地费用一览)
- 国足马尔代夫时间(中国足球队在马尔代夫准备亚洲杯比赛)
- 广安中的马尔代夫(广安市民玩转马尔代夫,留下美好回忆)
- 成都蒲江马尔代夫(成都蒲江现美景:恍若置身马尔代夫!)
- 拍摄马尔代夫海景(美丽的马尔代夫:浪漫海滩和碧蓝海水)
- 昆明马尔代夫地址(昆明的马尔代夫,美轮美奂的度假胜地)
- 栾川马尔代夫游记(纯净无邪的马尔代夫之旅——栾川游记)
- 入境 马尔代夫(马尔代夫:梦幻天堂中的海底世界)
- 春节马尔代夫海岛(春节马尔代夫旅游,享受热带海岛风情)
- 巴黎 马尔代夫(巴黎与马尔代夫一同迎接旅游复苏)
- 泳池漂浮马尔代夫(马尔代夫泳池现巨型浮漂,引游客围观)
- 泰国的小马尔代夫(泰国探秘最美海岛,称之为小马尔代夫)
- 渭南马尔代夫沙滩(渭南市区现代版马尔代夫小岛遭疯抢!)
- 意大利小马尔代夫(意大利海滨度假胜地被誉为小马尔代夫)
- 港丽马尔代夫度假(港丽马尔代夫度假村:远离尘嚣的天堂)
- 虎鲨马尔代夫潜水(潜游马尔代夫:与虎鲨同游的惊艳之旅)
- 邢台马尔代夫烧烤(邢台市民在马尔代夫品尝传统烧烤佳肴)
- 西安马尔代夫帅哥(西安男子徒步穿越印度洋定居马尔代夫)
- 观海之心马尔代夫(观海心情:马尔代夫岛国风光尽收眼底)
- 漳州马尔代夫海景(漳州湾畔享受马尔代夫海景奢华度假村)
- 网球 马尔代夫(马尔代夫网球赛:最美妙的海滩之战)
- 马尔代夫下班休息(马尔代夫的日落时光:下班休息已启动)
- 马尔代夫香茅味道(标题:感受马尔代夫的香茅芳香气息)
- 四女 马尔代夫(四位女游客马尔代夫旅游经历分享)
- 康亮 马尔代夫(康亮:马尔代夫推动环境可持续性,制定新政策)
- 长治马尔代夫婚礼(长治恋人在马尔代夫海边举行梦幻婚礼)
- 十一 马尔代夫(马尔代夫迎来长假黄金周,游客量创新高)
- 马尔代夫偷带珊瑚(马尔代夫游客遭警方逮捕涉嫌偷带珊瑚)
- 马尔代夫位置定位(马尔代夫地图:定位、位置、景点介绍)
