C++适配器

文章目录

  • 引言
    • 栈和队列
  • priority_queue
    • 仿函数
    • 迭代器区间

引言

栈的特性是先进后出,队列的特性是先进先出,然而双向队列同时具有栈和队列的特性,所以我们可以通过双向队列来适配出栈和队列。
先看库里面

栈和队列

C++适配器_第1张图片
C++适配器_第2张图片
C++适配器_第3张图片
stack和queue模板参数里面都有一个class Container = deque,就是说库里面在实现它们时默认是通过deque适配出来的。
比如stack的push底层其实是通过调用deque的push_back()实现的,pop底层是通过调用deque的pop_back()实现的
C++适配器_第4张图片

对于queue的push底层是通过调用deque的push_front()实现的,pop是通过调用deque的1pop_front()实现的
C++适配器_第5张图片

priority_queue

优先队列底层就是堆,使用数组实现的,所以我们可以使用容器vector适配出优先队列
C++适配器_第6张图片

仿函数

此外还有一个参数
class Compare = less
这个参数其实就是一个仿函数,什么是仿函数呢?就是把一个类对象像函数一样使用。怎么实现呢?底层就是把这个类重载了一个()运算符。在传这个参数时,我们可以自己实现一个仿函数去传,也可以使用库里面的
C++适配器_第7张图片
C++适配器_第8张图片
这两个是库里面包含的两个仿函数,用于比较大小,去排序,值得注意的是这里的less指的是升序,而greater是指降序
C++适配器_第9张图片

C++适配器_第10张图片
因此优先队列默认不传第二个参数的情况下,输出结果是升序

//仿函数/函数对象
//重载了括号,让类可以向函数一样被调用
template<class T>
class Less
{
public:
	bool operator()(const T& x, const T& y)
	{
		return x < y;
	}
};

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

库里面
//template  struct less : binary_function  {
//	bool operator() (const T& x, const T& y) const { return x < y; }
//};
//
//template  struct greater : binary_function  {
//	bool operator() (const T& x, const T& y) const { return x > y; }
//};

迭代器区间

C++适配器_第11张图片

C++适配器_第12张图片
C++适配器_第13张图片

容器对象的构造函数还支持迭代器区间初始化,就是通过迭代器去迭代别的对象中存的值来对这个对象进行初始化。

template<class InputInterator>
priority_queue(InputInterator first, InputInterator last)
{
	//插入数据
	while (first != last)
	{
		_con.push_back(*first);
		++first;
	}

	//建堆
	//从最后一个非叶子节点开始建堆-----关键
	for (int i = (_con.size()-1-1) / 2; i >= 0; i--)
	{
		AdjustDown(i);
	}
}

你可能感兴趣的:(C++,c++)