priority_queue的用法

本文详细介绍了如何使用STL中的make_heap(), pop_heap(), push_heap()算法来实现Priority Queue,并探讨了基本类型和自定义类型在Priority Queue中的应用。

      priority_queue调用 STL里面的 make_heap(), pop_heap(), push_heap() 算法实现,也算是堆的另外一种形式。先写一个用 STL 里面堆算法实现的与真正的STL里面的 priority_queue用法相似的priority_queue, 以加深对 priority_queue 的理解

?
      STL里面的 priority_queue 写法与此相似,只是增加了模板及相关的迭代器什么的。 
      priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数:
      priority_queue<Type, Container, Functional>
      其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
      Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.
      STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个 参数缺省的话,
      优先队列就是大顶堆,队头元素最大。
如果要用到小顶堆,则一般要把模板的三个参数都带进去。
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

class priority_queue
{
private:
	vector<int> data;
public:
	void push(int t ){ 
		data.push_back(t);
		push_heap( data.begin(), data.end()); 
	}

	void pop(){
		pop_heap( data.begin(), data.end() );
		data.pop_back();
	}
	int top() { return data.front(); }
	int size() { return data.size(); }
	bool empty() { return data.empty(); }
};

int main()
{
	priority_queue test;
	test.push( 3 );
	test.push( 5 );
	test.push( 2 );
	test.push( 4 );

	while( !test.empty() )
	{
		cout << test.top() << endl;
		test.pop();
	}

	return 0;
}
STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆
#include<queue>
int main()
{
	priority_queue<int, vector<int>, greater<int> > q;//小顶堆
	//priority_queue<int> q; //大顶堆
	for(int i= 0; i< 10; ++i ) 
		q.push( rand() );
	while( !q.empty() )
	{
		cout << q.top() << endl;
		q.pop();
	}
	getchar();
	return 0;
}

对于自定义类型,则必须自己重载 operator< 或者自己写仿函数
 
?
#include <iostream>
#include <queue>
 
using  namespace  std;
 
struct  Node{
     int  x, y;
     Node( int  a= 0, int  b= 0 ):
         x(a), y(b) {}
};
 
bool  operator<( Node a, Node b ){
     if ( a.x== b.x ) return  a.y> b.y;
     return  a.x> b.x;
}
 
int  main(){
     priority_queue<Node> q;
     
     for ( int  i= 0; i< 10; ++i )
     q.push( Node( rand (), rand () ) );
     
     while ( !q.empty() ){
         cout << q.top().x << ' '  << q.top().y << endl;
         q.pop();
     }
     
     getchar ();
     return  0;
}

自定义类型重载 operator< 后,声明对象时就可以只带一个模板参数。
但此时不能像基本类型这样声明
priority_queue<Node, vector<Node>, greater<Node> >;
原因是 greater<Node> 没有定义,如果想用这种方法定义 则可以按如下方式:
 
?
#include <iostream>
#include <queue>
 
using  namespace  std;
 
struct  Node{
     int  x, y;
     Node( int  a= 0, int  b= 0 ):
         x(a), y(b) {}
};
 
struct  cmp{
     bool  operator() ( Node a, Node b ){
         if ( a.x== b.x ) return  a.y> b.y;
         
         return  a.x> b.x; }
};
 
int  main(){
     priority_queue<Node, vector<Node>, cmp> q;
     
     for ( int  i= 0; i< 10; ++i )
     q.push( Node( rand (), rand () ) );
     
     while ( !q.empty() ){
         cout << q.top().x << ' '  << q.top().y << endl;
         q.pop();
     }
     
     getchar ();
     return  0;
}

priority_queue调用 STL里面的 make_heap(), pop_heap(), push_heap() 算法实现,也算是堆的另外一种形式。先写一个用 STL 里面堆算法实现的与真正的STL里面的 priority_queue用法相似的priority_queue, 以加深对 priority_queue 的理解

?
#include <iostream>
#include <algorithm>
#include <vector>
 
using  namespace  std;
 
class  priority_queue
{
     private :
         vector< int > data;
         
     public :
         void  push( int  t ){
             data.push_back(t);
             push_heap( data.begin(), data.end());
         }
         
         void  pop(){
             pop_heap( data.begin(), data.end() );
             data.pop_back();
         }
         
         int  top() { return  data.front(); }
         int  size() { return  data.size(); }
         bool  empty() { return  data.empty(); }
};
 
 
int  main()
{
     priority_queue test;
     test.push( 3 );
     test.push( 5 );
     test.push( 2 );
     test.push( 4 );
     
     while ( !test.empty() ){
         cout << test.top() << endl;
         test.pop(); }
         
     return  0;
 
}
 
STL里面的 priority_queue 写法与此相似,只是增加了模板及相关的迭代器什么的。 

priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数:
priority_queue<Type, Container, Functional>

其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.
STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个 参数缺省的话,
优先队列就是大顶堆,队头元素最大。
 
?
#include <iostream>
#include <queue>
 
using  namespace  std;
 
int  main(){
     priority_queue< int > q;
     
     for ( int  i= 0; i< 10; ++i ) q.push( rand () );
     while ( !q.empty() ){
         cout << q.top() << endl;
         q.pop();
     }
     
     getchar ();
     return  0;
}
 
如果要用到小顶堆,则一般要把模板的三个参数都带进去。
STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆
 
?
#include <iostream>
#include <queue>
 
using  namespace  std;
 
int  main(){
     priority_queue< int , vector< int >, greater< int > > q;
     
     for ( int  i= 0; i< 10; ++i ) q.push( rand () );
     while ( !q.empty() ){
         cout << q.top() << endl;
         q.pop();
     }
     
     getchar ();
     return  0;
}

 

对于自定义类型,则必须自己重载 operator< 或者自己写仿函数
 
?
#include <iostream>
#include <queue>
 
using  namespace  std;
 
struct  Node{
     int  x, y;
     Node( int  a= 0, int  b= 0 ):
         x(a), y(b) {}
};
 
bool  operator<( Node a, Node b ){
     if ( a.x== b.x ) return  a.y> b.y;
     return  a.x> b.x;
}
 
int  main(){
     priority_queue<Node> q;
     
     for ( int  i= 0; i< 10; ++i )
     q.push( Node( rand (), rand () ) );
     
     while ( !q.empty() ){
         cout << q.top().x << ' '  << q.top().y << endl;
         q.pop();
     }
     
     getchar ();
     return  0;
}

自定义类型重载 operator< 后,声明对象时就可以只带一个模板参数。
但此时不能像基本类型这样声明
priority_queue<Node, vector<Node>, greater<Node> >;
原因是 greater<Node> 没有定义,如果想用这种方法定义 则可以按如下方式:
 
?
#include <iostream>
#include <queue>
 
using  namespace  std;
 
struct  Node{
     int  x, y;
     Node( int  a= 0, int  b= 0 ):
         x(a), y(b) {}
};
 
struct  cmp{
     bool  operator() ( Node a, Node b ){
         if ( a.x== b.x ) return  a.y> b.y;
         
         return  a.x> b.x; }
};
 
int  main(){
     priority_queue<Node, vector<Node>, cmp> q;
     
     for ( int  i= 0; i< 10; ++i )
     q.push( Node( rand (), rand () ) );
     
     while ( !q.empty() ){
         cout << q.top().x << ' '  << q.top().y << endl;
         q.pop();
     }
     
     getchar ();
     return  0;
}
内容概要:本文档是一份关于交换路由配置的学习笔记,系统地介绍了网络设备的远程管理、交换机与路由器的核心配置技术。内容涵盖Telnet、SSH、Console三种远程控制方式的配置方法;详细讲解了VLAN划分原理及Access、Trunk、Hybrid端口的工作机制,以及端口镜像、端口汇聚、端口隔离等交换技术;深入解析了STP、MSTP、RSTP生成树协议的作用与配置步骤;在路由部分,涵盖了IP地址配置、DHCP服务部署(接口池与全局池)、NAT转换(静态与动态)、静态路由、RIP与OSPF动态路由协议的配置,并介绍了策略路由和ACL访问控制列表的应用;最后简要说明了华为防火墙的安全区域划分与基本安全策略配置。; 适合人群:具备一定网络基础知识,从事网络工程、运维或相关技术岗位1-3年的技术人员,以及准备参加HCIA/CCNA等认证考试的学习者。; 使用场景及目标:①掌握企业网络中常见的交换与路由配置技能,提升实际操作能力;②理解VLAN、STP、OSPF、NAT、ACL等核心技术原理并能独立完成中小型网络搭建与调试;③通过命令示例熟悉华为设备CLI配置逻辑,为项目实施和故障排查提供参考。; 阅读建议:此笔记以实用配置为主,建议结合模拟器(如eNSP或Packet Tracer)动手实践每一条命令,对照拓扑理解数据流向,重点关注VLAN间通信、路由选择机制、安全策略控制等关键环节,并注意不同设备型号间的命令差异。
C++中的`priority_queue`是一种优先队列,其默认实现是最大堆。它允许以对数时间复杂度插入元素,并且每次操作后队列顶部始终是当前所有元素中优先级最高的一个。对于基本类型,默认的排序准则是通过小于运算符(`operator <`)来定义降序排列,而对于自定义类型(如结构体),需要显式地提供比较逻辑。 ### 使用结构体进行自定义排序 当使用结构体作为`priority_queue`的元素时,需要为其定义排序规则。这可以通过以下两种方式之一完成: 1. **重载小于运算符 (`operator <`)** 在结构体内部重载`<`运算符,这样可以直接在默认模板参数下使用该结构体。例如: ```cpp struct Person { int age; bool operator<(const Person& other) const { return age < other.age; // 最大堆,年龄大的排前面 } }; std::priority_queue<Person> pq; ``` 2. **自定义比较函数对象** 如果希望使用不同的排序准则或者不便于修改结构体定义,则可以传递一个比较函数或函数对象给`priority_queue`的模板参数列表。例如: ```cpp struct Person { int age; }; struct ComparePerson { bool operator()(const Person& a, const Person& b) { return a.age < b.age; // 最大堆 } }; std::priority_queue<Person, std::vector<Person>, ComparePerson> pq; ``` ### 示例代码 下面是一个完整的示例,展示如何使用结构体与自定义比较器来创建一个基于年龄排序的优先队列: ```cpp #include <iostream> #include <queue> struct Person { int age; }; // 自定义比较器 struct ComparePerson { bool operator()(const Person& a, const Person& b) { return a.age < b.age; // 年龄大的优先 } }; int main() { std::priority_queue<Person, std::vector<Person>, ComparePerson> pq; // 插入数据 pq.push({30}); pq.push({25}); pq.push({40}); // 输出并移除队列顶部元素 while (!pq.empty()) { std::cout << pq.top().age << " "; pq.pop(); } return 0; } ``` 在这个例子中,输出将会是按年龄从高到低排序的结果:`40 30 25`。 ### 注意事项 - `priority_queue`底层通常采用`vector`作为容器,并利用堆算法维护堆属性。 - 默认情况下,`priority_queue`构造的是最大堆;若要构造最小堆,可通过指定第三个模板参数为`std::greater<>`[^4]。 - 当处理复杂类型的元素时,确保比较逻辑正确无误,以免导致错误的排序结果。 以上方法适用于大多数情况下的需求,能够灵活地适应不同场景下的自定义排序要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值