文章目录
============================ 【说明】 ===================================================
大家好,本专栏主要是跟学C++内容,自己学习了这位博主【 AI菌】的【C++21天养成计划】,讲的十分清晰,适合小白,希望给这位博主多点关注、收藏、点赞。
主要针对所学内容,通过自己的理解进行整理,希望大家积极交流、探讨,多给意见。后面也会给大家更新,其他一些知识。若有侵权,联系删除!共同维护网络知识权利!
=======================================================================================
1、队列
队列是数据结构与算法中比较重要的一节,它强调一端增加(入队)和另一端删除(出队)元素,是一种先进先出(后进后出)的结构。具体内容可以跳转数据结构–队列部分–>数据结构。
其实,队列并不难理解,队列可以联想到我们平时排队。但是在编程语言中,队列是一种怎样的存在呢?
其实也是类似的,可以将队列视为在排队做核酸的我们,那么先加入这个队列的人就会先进行核酸检测;而后加入的人不能插队,只能从队尾开始排队。
2、队列–queue类的使用
在实际问题中,仅仅了解队列的含义是不够的,我们还需要在实际编程中去使用它。在C++中,已经提供了用于队列操作的queue
类。给我们使用队列提供了很大的方便。
STL queue
是一个模板类,它只允许在末尾插入元素,并且从开头删除元素。在使用之前,必须包含
头文件:
include <queue>
2.1 实例化queue
在C++中,对queue
类的定义如下:
template<
class elementType,
class Container = deque<Type>
>class queue;
说明:
1. elementType
是queue对象包含元素的类型
2. Container
是std::queue
用于存储元素的集合类型,默认是deque
,也可将该参数设置为list、vector。
当需要使用queue类进行队列操作时,我们就需要实例化:
#include <iostream>
#include <queue>
#include <list>
using namespace std;
int main()
{
//1. 实例化一个整型队列nums,用来存放int类型元素
queue<int> nums;
//2. 实例化一个浮点型队列doubleNums
queue<double> doubleNums;
//3. 创建一个队列,元素类型为double,并使用list存储这些元素
queue<double, list<double>> doubleList;
//4. 使用一个queue(nums)去实例化另一个queue(numsCopy)
queue<int> numsCopy(nums);
return 0;
}
2.2 queue的成员函数
我们需要灵活使用队列,仅学会实例化创建queue是不够的,还需要学习queue的成员函数,从而更方便的处理队列问题。我们常见的queue类成员函数有:
函数名 | 解释 |
---|---|
push | 在队尾增加一个元素 |
pop | 在队头删除一个元素 |
front | 返回指向队首元素的引用 |
back | 返回指向队尾元素的引用 |
empty | 检查队列是否为空,并返回布尔值 |
size | 返回队列中元素个数 |
注: queue
没有提供begin()
和end()
函数,所以不能使用迭代器,因此无法将STL算法用于queue。这样设计,也是为了queue类只能进行符合队列行为的操作。
下面通过案例来熟悉一下以上常见的成员函数:
#include <iostream>
#include <queue>
using namespace std;
int main(){
queue<int> nums; // 实例化一个整型队列nums,用来存放int类型元素
cout << "依次将1、5、10、15插入队尾" << endl;
nums.push(1);
nums.push(5);
nums.push(10);
nums.push(15);
cout << "The queue 【nums】 has " << nums.size() << " numbers." << endl;
cout << "The queue 【nums】 first number: " << nums.size() << endl;
cout << "The queue 【nums】 last number: " << nums.back() << endl;
nums.pop();
nums.pop();
nums.pop();
nums.pop();
if (nums.empty())
cout << "该队列是空的!" << endl;
return 0;
}
3、优先级队列–priority_queue类的使用
priority_queue
类与queue
类最大的不同之处在于:priority_queue
类包含最大值的元素位于队首,且只能在队首执行操作。
priority_queue
类和queue
类一样也是模板类,使用之前,必须包含头文件:
#include <queue>
3.1 实例化priority_queue
在C++中,对priority_queue
类的定义如下:
template<
class elementType,
class Container=vector<Type>,
class Compare=less<typename Container::value_type>
>
>class priority_queue
说明:
1. elementType
指定了优先级队列包含元素的类型;
2. Container
是priority_queue
用于存储元素的集合类型,默认是vector
,也可将该参数设置为list、deque。
3. Compare
用来指定一个二元谓词,以判断哪个元素位于队首。如果没有指定二元谓词,将默认使用std::less,它使用运算符<比较对象。
二元谓词是:返回bool型,帮助决策的二元函数。二元谓词可用于stl:sort()等排序算法中。
创建一个元素类型为int, 按从小到大顺序存储的队列,且指定存储的容器为deque:
priority_queue <int, deque<int>, greater<int>> nums;
如果想改变存储的顺序,希望从大到小存储;只需将greater改为less:
priority_queue <int, deque<int>, less<int>> nums;
当需要使用priority_queued类进行队列操作时,我们就需要实例化:
#include <iostream>
#include <queue>
using namespace std;
int main()
{
//1. 实例化一个整型优先队列nums,用来存放int类型元素
priority_queue<int> nums;
//2. 实例化一个浮点型优先队列doubleNums
priority_queue<double> doubleNums;
//3. 创建一个元素类型为int,按从小到大顺序存储的队列,且指定存储的容器为deque
priority_queue <int, deque<int>, greater<int>> nums;
//4. 使用一个优先级队列nums去实例化另一个优先级队列numsCopy
priority_queue<int> numsCopy(nums);
return 0;
}
3.1 priority_queued的成员函数
我们需要灵活使用队列,仅学会实例化创建priority_queued是不够的,还需要学习priority_queued的成员函数,从而更方便的处理队列问题。我们常见的priority_queued类成员函数有:
函数名 | 解释 |
---|---|
push | 在优先级队尾增加一个元素 |
pop | 在优先级队头删除一个元素 |
empty | 检查队列是否为空,并返回布尔值 |
size | 返回优先级队列中元素个数 |
emplace | 在优先级队列中,插入一个新元素 |
top | 返回指向队首第一个元素(最大元素)的引用 |
注:当使用默认的二元谓词std::less
时, top()
返回的是最大元素;当指定二元谓词是greater
, 即从小到大的顺序存储,则top()
返回的值是最小元素。
下面通过案例来熟悉一下以上常见的成员函数:
//队列
int main() {
priority_queue<int> nums;
cout << "push 1,3,5,7 into queue 【nums】:"<<endl;
nums.push(1);
nums.push(5);
nums.push(-1);
nums.push(100);
cout << "The queue 【nums】 has " << nums.size() << " numbers." << endl;
cout << "The front number is:" << nums.top() << endl;
cout << "The back number is:" << nums.top() << endl;
for (int i = 0; i < 4; i++)
{
cout << "Pop the number:" << nums.top() << endl;
nums.pop();
}
if (nums.empty())
{
cout << "The queue 【nums】 is empty!" << endl;
}
return 0;
}
4、总结
最后,长话短说,大家看完就好好动手实践一下,切记不能三分钟热度、三天打鱼,两天晒网。大家也可以自己尝试写写博客,来记录大家平时学习的进度,可以和网上众多学者一起交流、探讨,我也会及时更新,来督促自己学习进度。一开始提及的博主【AI菌】,个人已关注,并订阅了相关专栏(对我有帮助的),希望大家觉得不错的可以点赞、关注、收藏。