C++ stl容器stack,queue,priority

慈云数据 6个月前 (05-14) 技术支持 37 0

目录

目录

前言:

文档借鉴:Reference - C++ Reference

1.deque

a.deque的结构特点:

b.deque的迭代器结构:

c.面试题

2.stack

3.queue

4.仿函数

5.priority_queue

6.头文件的包含注意问题



前言:

本篇一共简单实现3个容器,其中stack和queue的底层适配器是deque,所以会先介绍一下deque,而对于优先级队列priority_queue就是使用堆实现的,库中底层适配器是vector,另外对于优先级队列中堆的调整还会使用仿函数进行比较,所以本篇还会简单介绍一下仿函数。

文档借鉴:Reference - C++ Reference

1.deque

a.deque的结构特点:

deque简单来说就是vector和list的合体,再来复习一下vector和list的优缺点

 我们再开看看deque的结构:

deque是存储在一个指针数组里面的,从中间开始存小的buff数组(指针数组里面存放的是指针,每个指针指向小的数组),这样头插尾插相比vector就方便了,当中控满了才扩容,扩容代价低是因为是指针数组,扩容只需要扩指针指向的空间就行。

所以deque的优缺点就是:

 

优点:

1.相比vector,扩容的代价低。

2.头插头删,尾插尾删效率高。

3.也支持随机访问。

缺点:

1.中间插入数据很难搞,如果想要中间插入数据效率高,可以控制每个buff小数组的大小不一样,从而挪动数据的消耗少,但小数组大小不一样随机访问就麻烦了;反过来,如果小数组固定数据,随机访问的效率就高了,但是中间插入数据就慢了,sgi版本采用数据固定,二者都可以,很灵活。

2.没有vector和list优点极致。

应用

一般引用于栈和队列的底层容器,对于数据多的情况也差不多,高速缓存效率也可以,避免内存碎片化。

顺便一提,对于100万个数据进行排序,都不如vector排序后再拷贝回来速度快:

b.deque的迭代器结构:

c.面试题:

 

遍历时频繁检测是否移动到某段小空间的边界了,意思就是需要遍历每个buff小数组,导致效率低下。 

注意stack和queue没有迭代器,所以不能使用迭代器遍历。

2.stack

#pragma once
namespace my_stack
{
	template
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}
		void pop()
		{
			_con.pop_back();
		}
		const T& top()
		{
			return _con.back();
		}
		size_t size()
		{
			return _con.size();
		}
		bool empty()
		{
			return _con.empty();
		}
	private:
		Container _con;
	};
	void testStack1()
	{
		stack s1;
		s1.push(1);
		s1.push(2);
		s1.push(3);
		s1.push(4);
		while (!s1.empty())
		{
			cout 
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon