怎么在c++项目中利用priority_queue自定义排序

  介绍

这篇文章给大家介绍怎么在c++项目中利用priority_queue自定义排序,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

首先,无论priority_queue中存储的是基础数据类型(int,双等),还是字符串类对象或者自定义的类对象,都可以使用函数对象的方式自定义排序规则。例如:

# include   # include   using  namespace 性传播疾病;//函数对象类   template  & lt; typename  T>   class  cmp   {   公众://重才能载,(),运算符   bool 才能操作符()(T ,, T  b)   {才能   ,,,return  a 祝辞,b;   ,,}   };   int  main ()   {   int 才能;[],=,{,4、2、3、5、6,};   priority_queue<才能,int vector cmp,祝辞,pq(一个+ 5);   while 才能;(! pq.empty ())   {才能   ,,,cout  & lt; & lt;, pq.top (), & lt; & lt;,,,,,   ,,,pq.pop ();   ,,}   return 才能;0;   }

运行结果为:
2 3 4 5 6

注意,c++中的结构体和类非常类似,前者也可以包含成员变量和成员函数,因此上面程序中,函数对象类cmp也可以使用结构体关键字创建:

struct  cmp   {//重才能载,(),运算符   bool 才能操作符()(T ,, T  b)   {才能   ,,,return  a 祝辞,b;   ,,}   };

可以看的到,通过在cmp类(结构体)重载的()运算符中自定义排序规则,并将其实例化后作为priority_queue模板的第3个参数传入,即可实现为priority_queue容器适配器自定义比较函数。

除此之外,当priority_queue容器适配器中存储的数据类型为结构体或者类对象(包括字符串类对象)时,还可以通过重载其比;或者& lt;运算符,间接实现自定义排序规则的目的。

注意,此方式仅适用于priority_queue容器中存储的为类对象或者结构体变量,也就是说,当存储类型为类的指针对象或者结构体指针变量时,此方式将不再适用,而只能使用函数对象的方式。

要想彻底理解这种方式的实现原理,首先要搞清楚std:: less和std:: greater各自的底层实现。实际上,& lt; function>头文件中的std:: less和std:: greater,各自底层实现采用的都是函数对象的方式,比如,std:: less的底层实现代码为:

template  & lt; typename  T>   struct  less  {//才能定义新的排序规则   bool 才能操作符()(const  T 和_lhs, const  T , _rhs), const  {   ,,,return  _lhs  & lt;, _rhs;   ,,}   };

std:: greater的底层实现代码为:

template  & lt; typename  T>   struct  greater  {   bool 才能操作符()(const  T 和_lhs, const  T , _rhs), const  {   ,,,return  _lhs 祝辞,_rhs;   ,,}   };

可以看的到,std:: less和std:: greater底层实现的唯一不同在于,前者使用& lt;号实现从大到小排的序,后者使用比;号实现从小到大排序。

那么,是否可以通过重载& lt;或者比;运算符修改std:: less和std:: greater的排序规则,从而间接实现自定义排序呢?答案是肯定的,举个例子:

# include   # include   using  namespace 性传播疾病;   class  node  {   公众:   节点才能(int  x =, 0,, int  y =, 0),: x (x), y (y), {}   int 才能,x,, y;   };//新的排序规则为:先按照,x 值排序,如果,x 相等,则按,y 的值排序   bool  operator  & lt;, (const  node ,,, const  node , b), {   if 才能;(a.x 祝辞,b.x), return  1;   else 才能;if  (a.x ==, b.x)   ,,,if  (a.y 祝辞=,b.y), return  1;   return 才能;0;   }   int  main (), {//创才能建一个,priority_queue 容器适配器,其使用默认的,vector 基础容器以及,less 排序规则。   priority_queue<才能;node>, pq;   pq.push才能(节点(1,2));   pq.push才能(节点(2,2));   pq.push才能(节点(3,4));   pq.push才能(节点(3,3));   pq.push才能(节点(2,3));   cout 才能;& lt; & lt;,“x  y", & lt; & lt;, endl;   while 才能;(! pq.empty ()), {   ,,,cout  & lt; & lt;, pq.top () .x  & lt; & lt;,,,,, & lt; & lt;, pq.top () .y  & lt; & lt;, endl;   ,,,pq.pop ();   ,,}   return 才能;0;   }

怎么在c++项目中利用priority_queue自定义排序