STL之priority_queue为复合结构排序

priority_queue为复合结构排序: 

 1 #include <iostream>
 2 #include <queue>
 3
 4 using namespace std;
 5 struct Node{
 6     int x;
 7     string  y;
 8     Node( int a= 0, string b = "" ):
 9         x(a), y(b) {}
10 };
11 bool operator<( Node a, Node b ){   // 注意这里的顺序和sort()里面的谓词函数不一样!
12                                     // bool为真的 优先级小
13     if( a.x == b.x ) return a.y < b.y;
14     return a.x < b.x;
15 }
16       //自定义重载小于操作符
17 int main(){
18    /********************************************
19    对于自定义类型,则必须自己重载 operator<
20    自定义类型重载 operator< 后,声明对象时就可以只带一个模板参数。
21    看下面的例子
22    *******************************************/
23
24     cout<<"自定义: "<<endl;
25     priority_queue<Node> q2;
26     priority_queue<int> q3;
27     std::string tmp = "";
28
29     for( int i= 10; i>0; --i ){
30         tmp = tmp + "12";
31         q2.push( Node(i, tmp) );
32         q3.push(i);
33     }
34     while( !q2.empty() ){
35         cout << q2.top().x << ‘ ‘ << q2.top().y << endl;
36         q2.pop();
37     }
38     while( !q3.empty() ){
39         cout << "q3 output: "<<q3.top() << endl;
40         q3.pop();
41     }
42     //注意上面不能这样来定义:priority_queue<Node, vector<Node>, greater<Node> >;
43     //这样定义是错误的!!!!
44     //原因是:greater<node>没有定义
45
46     //必须定义如下函数对象,才能这样定义:
47     // priority_queue<Node, vector<Node>, cmp >;
48     /*
49     struct cmp{
50     bool operator() ( Node a, Node b ){
51         if( a.x== b.x ) return a.y> b.y;
52
53         return a.x> b.x; }
54     };
55    */
56     return 0;
57 }
58
59 [email protected]:~/cp/test# g++ priority.cpp  -g -Wall
60 [email protected]:~/cp/test# valgrind  --tool=memcheck --leak-check=yes ./a.out
61 ==24385== Memcheck, a memory error detector
62 ==24385== Copyright (C) 2002-2011, and GNU GPL‘d, by Julian Seward et al.
63 ==24385== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
64 ==24385== Command: ./a.out
65 ==24385==
66 自定义:
67 10 12
68 9 1212
69 8 121212
70 7 12121212
71 6 1212121212
72 5 121212121212
73 4 12121212121212
74 3 1212121212121212
75 2 121212121212121212
76 1 12121212121212121212
77 q3 output: 10
78 q3 output: 9
79 q3 output: 8
80 q3 output: 7
81 q3 output: 6
82 q3 output: 5
83 q3 output: 4
84 q3 output: 3
85 q3 output: 2
86 q3 output: 1
87 ==24385==
88 ==24385== HEAP SUMMARY:
89 ==24385==     in use at exit: 0 bytes in 0 blocks
90 ==24385==   total heap usage: 20 allocs, 20 frees, 1,012 bytes allocated
91 ==24385==
92 ==24385== All heap blocks were freed -- no leaks are possible
93 ==24385==
94 ==24385== For counts of detected and suppressed errors, rerun with: -v
95 ==24385== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
时间: 2024-10-05 18:52:17

STL之priority_queue为复合结构排序的相关文章

【STL】priority_queue 的自定义排序

重载 operator< 或者自己写仿函数: 1 typedef struct{ 2 string name; 3 int rp; 4 }node; 5 6 bool operator <( node x, node y ){ 7 if(x.rp>y.rp) return 1; 8 else if(x.rp==y.rp && x.name<y.name) return 1; 9 return 0; 10 } 11 12 priority_queue <node

STL之priority_queue(优先队列)

priority_queue是一个容器适配器,在这个容器里第一个数据元素是最大的.它的使用场景是什么样:如果12306抢票,为什么黄牛能抢这么多票,感觉12306那边的请求队列是一个优先队列,黄牛的请求携带了一个隐含参数,所以他的请求最先执行.当然这是怀疑.不过也是优先级队列的使用场景.还可以进行排序,把数据压入优先队列中,然后出队列就是由大到小排列了 注意:stl的priority_queue容器需要一个boolean operator<(const T& ,const T&)函数

STL学习——Priority_queue篇

STL学习--Priority_queue篇 概述 priority_queue是一个拥有权值观念的queue,它允许加入新元素,移除旧元素,审视元素值等功能.因为它是queue,故只允许底端加入元素,顶端取出元素.priorit_queue内元素并非依照被推入的次序排列,而是依照元素权值排列.权值最高者,排在最前面. 实现 priority_queue利用max_heap和vector表现的完全二叉树实现.它的实现完全以底部容器为根据,并使用heap处理规则,故实现简单.默认情况,使用vect

(经典map)A - Hardwood Species(7.1.1)(利用STL中自带的排序功能编程的实验范例)(转)

Description Hardwoods are the botanical group of trees that have broad leaves, produce a fruit or nut, and generally go dormant in the winter. America's temperate climates produce forests with hundreds of hardwood species -- trees that share certain

C++ STL之priority_queue

STL中的priority_queue(优先队列)是一种会按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序的容器,不同优先级的情况下,top()上永远是最高优先级的数据,其底层采用的是堆结构(默认大顶堆).注意相同优先级下并没有先进先出,后面的例子中可以看到 头文件#include<queue> 标准库默认使用元素类型的<操作符来确定它们之间的优先级关系,数据越大优先级越高,想要改变优先级的界定方式的话需要重载<操作符. 先看个最简单的: #include<

STL之priority_queue的用法

priority_queue的用法:这里先将一下STL里面的heap(堆),再来将如何使用heap来实现优先队列 在STL里面: 下面介绍STL中与堆相关的4个函数--建立堆make_heap(),在堆中添加数据push_heap(),在堆中删除数据pop_heap()和堆排序sort_heap(): 头文件 #include <algorithm> 下面的_First与_Last为可以随机访问的迭代器(指针),_Comp为比较函数(仿函数),其规则--如果函数的第一个参数小于第二个参数应返回

STL之priority_queue

描述 使用STL中的优先队列,将一个字符串中的各个字符按照ASCII从大到小顺序排列. 部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码. int main() { priority_queue<char> qu; int n; cin>>n; while(n--) { Input(qu); while(!qu.empty()) { cout<<qu.top(); qu.pop(); } cout<<endl; } return 0; } 输入 输

优先队列 c++ STL之 priority_queue

优先队列 基本操作: empty pop push size top 默认:从大到小排序:priority_queue<int>q 从小到大:priority_queue<int,vector<int>,greater<int>>q 原文地址:https://www.cnblogs.com/Frank-King/p/9931554.html

STL源码分析——sort排序

稍微花了一点点时间看了一下老师推荐的博客:http://feihu.me/blog/2014/sgi-std-sort/,看完后无不赞叹STL追求效率之极致,STL的sort排序算法综合了三种排序快排,堆排和插入排序,被称为Introspective Sort(内省式排序),在算法内部根据自身不同的情形来判断来使用不同的算法进行排序,sort算法可以说综合了三种排序算法的优点,追求效率到了极致. 一开始sort算法有两部分组成,__introsort_loop和__final_insertion