C++stack和queue

C++stack和queue,第1张

系列文章目录

C++入门

C++类和对象(上)

C++类和对象(中)

C++类和对象(下)

C/C++内存管理

C++string类

C++vector类

C++list类


文章目录
  • 系列文章目录
  • 一、stack是什么?
  • 二、stack的使用
  • 三、queue是什么?
  • 四、queue的使用
  • 五、优先级队列
  • 六、优先级队列的使用


一、stack是什么?

1. stack是一种容器适配器,专门用在具有后进先出 *** 作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取 *** 作。

2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和d出。

二、stack的使用
函数说明接口说明
stack()构造函数不传参数构造一个空栈
empty()判空
size()返回元素个数
top()返回栈顶元素
push()压栈
pop()出栈
三、queue是什么?

1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中 *** 作,其中从容器一端插入元素,另一端提取元素。

2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。

四、queue的使用
函数声明接口说明
queue()构造函数
empty()判空
size()返回元素个数
front()返回队头元素
back()返回队尾元素
push()入队
pop()出队
五、优先级队列

1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。

2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。

3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”d出,其称为优先队列的顶部。

其实优先级队列就是堆。

六、优先级队列的使用
函数声明接口说明
priority_queue()构造函数
empty()判空
top()返回优先级队列中最大或最小元素,即堆顶元素
push()入队
pop()最大或最小元素出队, 即堆顶元素
#include 
#include 
#include  // greater算法的头文件
void TestPriorityQueue()
{
    // 默认情况下,创建的是大堆,其底层按照小于号比较
     vector<int> v{3,2,7,6,0,4,1,9,8,5};
    priority_queue<int> q1;
    for (auto& e : v)
     q1.push(e);
    cout << q1.top() << endl;
    
     // 如果要创建小堆,将第三个模板参数换成greater比较方式
     priority_queue<int, vector<int>, greater<int>> q2(v.begin(), v.end());
     cout << q2.top() << endl;
}

这段代码的倒数第二行好像很复杂,我们来仔细分析一下:

上图是优先级队列的模板参数,第一个参数是类型, 第二个参数是容器适配器,第三个参数是仿函数。

给大家进行一个简单的说明,容器适配器可以自己选定已有的容器。比如我定义一个类,第一个实例化用vector比较合适我就vector,但是第二个实例化用list更好,我就可以传list.

仿函数其实是一个类的成员函数的重载,必须实例化出一个对象才能使用。如下:

template<class T>
	class greater
	{
	public:
		bool operator()(const T& x, const T& y)
		{
			return x > y;
		}
	};

这个类中重载了() *** 作符。

template<class T, class Container = std::vector<T>, class Compare = less<typename Container::value_type>>
	class priority_queue
	{
	public:
		//大根堆
		void adjustUp()
		{
			Compare com;  //使用仿函数前要先实例化出一个对象
			size_t child = _con.size() - 1;
			size_t parents = (child - 1) >> 1;
			while (child > 0)
			{
				if (com(_con[parents], _con[child]))
				{
					std::swap(_con[child], _con[parents]);
					child = parents;
					parents = (child - 1) >> 1;
				}
				else
				{
					break;
				}
			}
		}

以上是模拟实现优先级队列的一部分,可以看到,使用仿函数前要先实例化出一个对象。同时,如果对第一行模板参数中的关键字typename不了解的可以看这篇文章:typename前缀


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/914599.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存