【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. }


相关文章
|
1月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
4月前
|
存储 设计模式 C++
【C++】优先级队列(容器适配器)
本文介绍了C++ STL中的线性容器及其适配器,包括栈、队列和优先队列的设计与实现。详细解析了`deque`的特点和存储结构,以及如何利用`deque`实现栈、队列和优先队列。通过自定义命名空间和类模板,展示了如何模拟实现这些容器适配器,重点讲解了优先队列的内部机制,如堆的构建与维护方法。
76 0
|
5月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
118 2
|
7天前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
37 16
|
11天前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
54 6
|
1月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
1月前
|
安全 编译器 C语言
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
|
1月前
|
存储 程序员 C语言
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。
|
1月前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
2月前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
85 19