废话不多说,直接上实现的代码
要想实现这个,对于优先级的把控,操作得理解清楚
相信各位看官仔细想想看我的注释,应该会看懂
namespace ghc
{
template<class T,class Container = vector<T>,class Compare = less<T>>
class priority_queue
{
public:
priority_queue(const T* first, const T* last, const Compare& pr = Compare())
:c(first, last), comp(pr)
{
//最后一个分支的位置
int curpos = c.size() / 2 - 1;
//在这循环控制次数
while (curpos >= 0)
{
_adjustdown(curpos);
curpos--;
}
}
bool empty()const
{
return c.empty();
}
size_t size() const
{
return c.size();
}
T& top()
{
return c.front();
}
void push(const T& x)
{
c.push_back(x);
_adjustup(c.size() - 1);
}
protected:
void _adjustdown(int start)
{
int n = c.size();
int i = start;
int j = 2 * i + 1; //指向最后一个分支的第一个子树
while (j < n)
{
//如果最后一个分支的第一个位置的数字小于第二个分支的数字,则j++
if (j + 1 < n && comp(c[j], c[j + 1]))
j++;
//最后一个分支的值和相比较子树大的那个比较
if (comp(c[i], c[j]))//ture
{
T tmp = c[i];
c[i] = c[j];
c[j] = tmp;
i = j;
j = 2 * i + 1;
}
}
else
break;
}
void _adjustup(int x)
{
int j = start;
int i = (j - 1) / 2;
while (j > 0)
{
if (comp(c.[i]), c[j])
{
T tmp = c[i];
c[i] = c[j];
c[j] = tmp;
j = i;
i = (j - 1) / 2;
}
else
break;
}
}
private:
Container c;
Compare comp;
};
}