🔥什么是适配器
以下是我在百度上看到的一句话。
对于这句话,我的理解如下。
举个生活中的例子
我们平常接触到的电流是220v,但是给手机充电时,肯定是用不了这么高的电压,所以我们通过“电源适配器”的转化,(充电器的全称是“电源适配器”,)变成合适的电压才能给手机充电。这里的“充电器”就起到了适配的作用。
🔥几种常见的适配器
c++中的适配器有三种:容器适配器,迭代器适配器,函数适配器
容器适配器:具体的有stack,queue,priorty-queue,默认的情况如下:stack和queue是基于deque实现的。
priorty-queue是在vector上实现的,可以根据第二个实参指定容器的类型,但是一定要符合标准,queue要求有push_back的操作,因此不能建立在vector的基础上,priorty-queue要求有随机访问的功能,因此建立在vector上。
🔥适配器如何使用
本文主要讲解priority_queue(优先级队列),我们需要了解以下知识:
- 优先级队列的底层使用堆实现的,因为堆的效率高,所以才用堆实现。
- 适配器的模版参数有多个,他们分别是:
- template <class T, class Container = vector, class Compare = less > class priority_queue;
画张图理解一下
void test()
{
std::priority_queue<int,vector<int>,less<int>> pq;
pq.push(1);
pq.push(5);
pq.push(0);
pq.push(2);
while (!pq.empty())
{
cout << pq.top()<<" ";
pq.pop();
}
cout << endl;
}
输出的结果如下:
如图可以看出,他是按照降序排序的。
void test()
{
std::priority_queue<int,vector<int>,greater<int>> pq;
pq.push(1);
pq.push(5);
pq.push(0);
pq.push(2);
while (!pq.empty())
{
cout << pq.top()<<" ";
pq.pop();
}
cout << endl;
}
输出结果如下
🔥适配器的模拟实现(以prrority_queue为例)
🏠 向上调整算法
void AdjustUp(int child)
{
Compare com;
int parent = (child - 1) / 2;
while (child>0)
{
if(com(_con[parent],_con[child]))
{
swap(_con[parent], _con[child]);
child = parent;
parent = (child - 1) / 2;
}
else
{
break;
}
}
}
🏠 向下调整算法
void AdjustDown(int root)
{
Compare com;
int parent = root;
int child = parent * 2 + 1;
while (child<_con.size())
{
if(child+1<_con.size()&&com(_con[child],_con[child+1]))
{
++child;
}
if(com(_con[parent],_con[child]))
{
swap(_con[parent], _con[child]);
parent = child;
child = parent + 2 + 1;
}
else
{
break;
}
}
}
🏠 插入数据
void push(const T& x)
{
_con.push_back(x);
AdjustUp(_con.size()-1);
}
🏠 删除数据
void pop()
{
swap(_con[0], _con[_con.size() - 1]);
_con.pop_back();
AdjustDown(0);
}
🏠 取出top数据
T& top()
{
return _con[0];
}
🏠 判空
bool empty()
{
return _con.empty();
}
🏠 元素个数(size)
size_t size()
{
return _con.size();
}