自动调整
namespace my{
template<class T,class Cont=vector<T>,class Comper=less<T>>//提供类型、容器、比较方法(默认大堆)
class priority_queue{
public:
priority_queue():c(){
}
template<class InputIterator>
priority_queue(InputIterator first,InputIterator last):c(first,last){
make_heap(c.begin(),c.end(),comp); //建立堆
}
public:
bool empty(){
return 0==c.size();
}
size_t size(){
return c.size();
}
public:
void push(const T &x){
c.push_back(x);
push_heap(c.begin(),c.end(),comp);//调整堆
}
void pop(){
pop_heap(c.begin(),c.end(),comp);
c.pop_back();
}
T top(){
return c.front();
}
private:
Cont c; //容器
Comper comp; //比较仿函数
};
};
int main(){
vector<int> v{3,2,7,60,4,1,9,8,5};
my::priority_queue<int> pq(v.begin(),v.end());
cout<<endl;
pq.push(100);
pq.push(200);
cout<<pq.top();
pq.pop();
cout<<pq.top();
return 0;
}
手动调整
namespace my{
template<class T,class Cont=vector<T>,class Comper=less<T>>//提供类型、容器、比较方法(默认大堆)
class priority_queue{
public:
priority_queue()
{}
template<class InputIterator>
priority_queue(InputIterator first,InputIterator last):c(first,last){
//手动调整堆
int n=c.size();
int start=n/2-1; //找到二叉树的最后一个分支
while(start>=0){
_AdjustDown(start,n);
start--;
}
}
public:
void show_heap()const{
for(int i=0;i<c.size();i++)
cout<<c[i]<<" ";
cout<<endl;
}
protected:
//向下调整
void _AdjustDown(int start,int n){
int i=start;
int j=2*i+1;//左子树
while(j<n){
if(j+1<n && c[j]<c[j+1]) //找到左右子树最大值
j++;
if(c[j]>c[i]){
T tmp=c[i];
c[i]=c[j];
c[j]=tmp;
//向下追踪
i=j;
j=2*i+1;
}//交换
else break;
}
}
private:
Cont c; //容器
Comper comp; //比较仿函数
};
};
int main(){
vector<int> v{3,2,7,60,4,1,9,8,5};
my::priority_queue<int> pq(v.begin(),v.end());
pq.show_heap();
return 0;
}
结果看还不错~
namespace my{
template<class T,class Cont=vector<T>,class Comper=less<T>>//提供类型、容器、比较方法(默认大堆)
class priority_queue{
public:
priority_queue()
{}
template<class InputIterator>
priority_queue(InputIterator first,InputIterator last):c(first,last){
//手动调整堆
int n=c.size();
int start=n/2-1; //找到二叉树的最后一个分支
while(start>=0){
_AdjustDown(start,n);
start--;
}
}
public:
void show_heap()const{
for(int i=0;i<c.size();i++)
cout<<c[i]<<" ";
cout<<endl;
}
void push(const T &x){
c.push_back(x);
_AdjustUp(c.size()-1);
}
void pop(){
std::swap(c[0],c[c.size()-1]);
c.pop_back();
_AdjustDown(0,c.size());
}
protected:
//向下调整
void _AdjustDown(int start,int n){
int i=start;
int j=2*i+1;//左子树
while(j<n){
if(j+1<n && c[j]<c[j+1]) //找到左右子树最大值
//if(comp(c[i],c[j]))
j++;
if(c[j]>c[i]){
T tmp=c[i];
c[i]=c[j];
c[j]=tmp;
//向下追踪
i=j;
j=2*i+1;
}//交换
else break;
}
}
//向上调整
void _AdjustUp(int start){
int j=start;//子
int i=(j-1)/2;//父
while(i>=0){
if(c[j]>c[i]){
T tmp=c[i];
c[i]=c[j];
c[j]=tmp;
j=i;
i=(j-1)/2;
}
else break;
}
}
private:
Cont c; //容器
Comper comp; //比较仿函数
};
};
int main(){
vector<int> v{3,2,7,60,4,1,9,8,5};
my::priority_queue<int> pq(v.begin(),v.end());
//my::priority_queue<int,vector<int>,generate<int>> pq(v.begin(),v.end());//小堆
pq.show_heap();
pq.push(15);
pq.pop();
pq.show_heap();
return 0;
}