这篇文章给大家介绍怎么在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自定义排序