#pragma once
namespace abc
{
template <class T, class Container = vector<T>, class Compare = std::less<T> >
class priority_queue
{
public:
priority_queue()
{}
template <class InputIterator>
priority_queue(InputIterator first, InputIterator last)
:c(first, last)
{
for (int i = (c.size() - 2) / 2; i >= 0; --i)
{
ad_just_down(i);
}
}
bool empty() const
{
return c.empty();
}
size_t size() const
{
return c.size();
}
const T& top() const
{
return c[0];
}
void ad_just_down(int pos)
{
int parent = pos;
int child = parent * 2 + 1;
//现在孩子是最大的那个
while (child < c.size())//直到没有孩子结束
{
if (child < (int)(c.size() - 1) && Compare()(c[child], c[child + 1]))
{
child++;//找最大孩子
}
std::swap(c[parent], c[child]);
parent = child;//更新孩子和父亲
child = parent * 2 + 1;
}
}
void ad_just_up(int pos)
{
int child = pos;
int parent = (child - 1) / 2;
while (child > 0)//只要父亲存在就继续
{
if (Compare{}(c[parent], c[child]))//父亲小于孩子
{
std::swap(c[parent], c[child]);
child = parent;
parent = (child - 1) / 2;
}
else
break;
}
}
void push(const T& x)
{
c.push_back(x);
ad_just_up(c.size() - 1);
}
void pop()
{
swap(c[0], c[c.size() - 1]);
c.pop_back();
ad_just_down(0);
}
private:
Container c;
Compare comp;
};
};
优先级队列
最新推荐文章于 2024-07-25 21:43:46 发布