【C++】-- STL容器适配器之queue

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 【C++】-- STL容器适配器之queue

队列

1.队列的性质

(1)队列是一种容器适配器,容器适配器即将特定容器类封装作为其底层容器类,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端删除元素。

(2) 队列作为容器适配器实现,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。

(3)底层容器可以是标准容器类模板之一,如可用vector、list可以作为底层容器类,也可以是其他专门设计的容器类,。该底层容器应至少支持以下操作:

       empty:检测队列是否为空

       size:返回队列中有效元素的个数

       front:返回队头元素的引用

       back:返回队尾元素的引用

       push_back:在队列尾部入队列

       pop_front:在队列头部出队列

(4)标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque。

2.队列类

(1)队列的构造

构造一个队列:

explicit queue (const container_type& ctnr = container_type());//构造一个队列

构造一个队列q1:

queue<int> q1;//构造一个空队列q1

(2)empty( )

判断队列是否为空

bool empty() const;

判断队列q1是否为空:

cout << q1.empty() << endl;

(3)push( )

向队尾插入一个元素

void push (const value_type& val);

向队尾插入4个元素,值分别为1,2,3,4

1.  q1.push(1);
2.  q1.push(2);
3.  q1.push(3);
4.  q1.push(4);

(4)pop( )

从队头删除一个元素

void pop();

删除队头元素

(5) size( )

求队列中元素的个数

size_type size() const;

求q1中元素个数:

cout << q1.size() << endl;

 

(6)front( )

返回队头元素

1. value_type& front();
2. const value_type& front() const;

返回q1队头元素:

cout << q1.front() << endl;

(7)back( )

返回队尾元素

1. value_type& back();
2. const value_type& back() const;

返回q1队尾元素:

cout << q1.back() << endl;

2.队列模拟实现

queue类的定义:

template <class T, class Container = deque<T> > class queue;

其中deque作为双端队列,queue如果没有指定底层容器为list等,那么会默认底层容器为deque。队列作为容器适配器, 不像string、vector、list等是完整的容器类,队列不是完整的容器类,而是提供特定接口的类,相当于在完整容器外面包装了一层,比如使用deque或list实现队列,就可以借助deque或list的操作来实现队列的操作。

队列的构造函数、拷贝构造函数、赋值运算符重载函数、析构函数不需要写,会调用deque自己的默认构造函数、拷贝构造函数、赋值运算符重载函数、析构函数。

017-queue.h

1. #pragma once
2. #include<iostream>
3. #include<deque>
4. using namespace std;
5. 
6. namespace delia
7. {
8.  template <class T, class Container = deque<T>>
9.  class queue
10.   {
11.   public:
12. 
13.     //向队尾插入一个元素
14.     void push(const T& x)
15.     {
16.       _con.push_back(x);
17.     }
18. 
19.     //从队头删除一个元素
20.     void pop()
21.     {
22.       _con.pop_front();
23.     }
24. 
25.     //返回队头元素
26.     T front()
27.     {
28.       return _con.front();
29.     }
30. 
31.     //返回队尾元素
32.     T back()
33.     {
34.       return _con.back();
35.     }
36. 
37.     //判断队列是否尾空
38.     bool empty()
39.     {
40.       return _con.empty();
41.     }
42. 
43.     //求队列中元素的个数
44.     size_t size()
45.     {
46.       return _con.size();
47.     }
48. 
49.   private:
50.     Container _con;
51.   };
52. 
53.   void test_queue()
54.   {
55.     queue<int> q1;
56.     q1.push(1);
57.     q1.push(2);
58.     q1.push(3);
59.     q1.push(4);
60. 
61.     q1.pop();//删除队头元素1
62. 
63.     cout << q1.front() << endl;//打印q1队头元素
64.     cout << q1.back() << endl;//打印q1队尾元素
65.     cout << q1.empty() << endl;//判断q1是否为空
66.     cout << q1.size() << endl;//求q1元素个数
67.   }
68. }

017-test.cpp

1. #include "017-queue.h"
2. 
3. int main()
4. {
5.  delia::test_queue();
6.  return 0;
7. }

假如底层不想用deque实现,但是不能用vector实现,因为队列的删除操作就是删除vector顺序表第一个元素,那么后面所有的元素都需要向前挪,效率低。可以用list实现,队列的删除操作就是修改头节点的_next指向和第2个节点的_prev指向,效率高。因此只需要修改第3行和第8行,将deque改为list即可:

1. #pragma once
2. #include<iostream>
3. #include<list>
4. using namespace std;
5. 
6. namespace delia
7. {
8.  template <class T, class Container = list<T>>
9.  class queue
10.   {
11.   public:
12. 
13.     //向队尾插入一个元素
14.     void push(const T& x)
15.     {
16.       _con.push_back(x);
17.     }
18. 
19.     //从队头删除一个元素
20.     void pop()
21.     {
22.       _con.pop_front();
23.     }
24. 
25.     //返回队头元素
26.     T front()
27.     {
28.       return _con.front();
29.     }
30. 
31.     //返回队尾元素
32.     T back()
33.     {
34.       return _con.back();
35.     }
36. 
37.     //判断队列是否尾空
38.     bool empty()
39.     {
40.       return _con.empty();
41.     }
42. 
43.     //求队列中元素的个数
44.     size_t size()
45.     {
46.       return _con.size();
47.     }
48. 
49.   private:
50.     Container _con;
51.   };
52. 
53.   void test_queue()
54.   {
55.     queue<int> q1;
56.     q1.push(1);
57.     q1.push(2);
58.     q1.push(3);
59.     q1.push(4);
60. 
61.     q1.pop();//删除队头元素1
62. 
63.     cout << q1.front() << endl;//打印q1队头元素
64.     cout << q1.back() << endl;//打印q1队尾元素
65.     cout << q1.empty() << endl;//判断q1是否为空
66.     cout << q1.size() << endl;//求q1元素个数
67.   }
68. }


相关文章
|
2天前
|
设计模式 算法 编译器
【C++】开始使用stack 与 queue
队列的相关习题大部分是子啊BFS中使用,这里就不在说明了
13 3
|
2天前
|
调度 C++ 容器
【C++】手搓 list 容器
本文我们实现了STL库中重要的list 的模拟实现,其中最重要莫过于迭代器的封装类的书写,这是前所未有的操作(对于我来说,我是第一次使用这种结构)。通过list 的模拟实现也帮我们巩固了类与对象的知识,也强化了指针操作的思路。欢迎大家讨论分析。
13 1
|
2天前
|
存储 设计模式 算法
【C++/STL】stack和queue(容器适配器、优先队列、双端队列)
【C++/STL】stack和queue(容器适配器、优先队列、双端队列)
14 1
|
2天前
|
存储 算法 前端开发
[C++基础]-stack和queue
[C++基础]-stack和queue
|
2天前
|
存储 算法 C++
详解C++中的STL(标准模板库)容器
【4月更文挑战第30天】C++ STL容器包括序列容器(如`vector`、`list`、`deque`、`forward_list`、`array`和`string`)、关联容器(如`set`、`multiset`、`map`和`multimap`)和容器适配器(如`stack`、`queue`和`priority_queue`)。它们为动态数组、链表、栈、队列、集合和映射等数据结构提供了高效实现。选择合适的容器类型可优化性能,满足不同编程需求。
|
2天前
|
监控 Kubernetes Docker
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
【5月更文挑战第9天】本文探讨了Docker容器中应用的健康检查与自动恢复,强调其对应用稳定性和系统性能的重要性。健康检查包括进程、端口和应用特定检查,而自动恢复则涉及重启容器和重新部署。Docker原生及第三方工具(如Kubernetes)提供了相关功能。配置检查需考虑检查频率、应用特性和监控告警。案例分析展示了实际操作,未来发展趋势将趋向更智能和高效的检查恢复机制。
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
|
2天前
|
Ubuntu Docker 容器
docker容器保存和导入
docker容器保存和导入
20 0
|
2天前
|
Ubuntu Docker 容器
清理docker容器
清理docker容器
12 0
|
2天前
|
Prometheus 监控 Cloud Native
构建高效稳定的Docker容器监控体系
【5月更文挑战第14天】 在现代微服务架构中,Docker容器作为应用部署的基本单元,其运行状态的监控对于保障系统稳定性和性能至关重要。本文将探讨如何构建一个高效且稳定的Docker容器监控体系,涵盖监控工具的选择、关键指标的采集、数据可视化以及告警机制的设计。通过对Prometheus和Grafana的整合使用,实现对容器资源利用率、网络IO以及应用健康状态的全方位监控,确保系统的高可用性和故障快速响应。
|
2天前
|
Prometheus 监控 Cloud Native
构建高效稳定的Docker容器监控体系
【5月更文挑战第13天】在微服务架构和容器化部署日益普及的背景下,对Docker容器的监控变得尤为重要。本文将探讨一种构建高效稳定Docker容器监控体系的方法,通过集成Prometheus和cAdvisor工具,实现对容器资源使用情况、性能指标和运行状态的实时监控。同时,结合Grafana进行数据可视化,为运维人员提供直观的分析界面,以便及时发现和解决潜在问题,保障系统的高可用性和稳定性。
29 6