C++排序之数组,Vector,priority_queue
2017-03-21 21:19
501 查看
说到c/c++排序,大家肯定想到用algorithm里的排序,或者c里的qsort.但真正理解的又有多少,故现在整理一下.
下面的代码将详细阐述数组排序问题.
sort默认从小到大排序.
priority_queue默认大的优先,所以队首的是最大的元素.
因为默认优先级相反,所以定义的方式也刚好相反.
自定义优先级的时候,比较函数可以写在结构体(或类)里,此时必须要写重载"<"的友元函数.此处有两个重点.
(1)重载的必须是"<"符号,重载">"会出错.
(2)必须是友元函数.
一.数组排序.
sort()函数默认从小到大的排序,如要从大到小的排序,一般人都会去写一个cmp函数,两三行代码解决?但是?能不能有更简单的方法呢?或者更加简短的代码?答案是肯定的.下面的代码将详细阐述数组排序问题.
#include<iostream> #include<algorithm> #include <ctime> using namespace std; int a[10]; void P() { static int t=0; if(t%2==0) cout<<"\n原数组:"; else cout<<"拍序后:"; t++; for(int i=0; i<10; i++) cout<<a[i]<<" "; cout<<endl; } void init() { for(int i=0; i<10; i++) a[i]=rand()%100+1; } bool cmp1(int x,int y) { return x<y;//小的优先(从小到大) } bool cmp2(int x,int y) { return x>y; } int main() { srand(time(NULL)); init(); P(); sort(a,a+10);//默认从小到大 P(); init(); P(); sort(a,a+10,cmp1);//从小到大 P(); init(); P(); sort(a,a+10,cmp2);//从大到小 P(); init(); //下面的方式更加简单,不用写cmp函数. sort(a,a+10,less<int>());//从小到大 P(); init(); sort(a,a+10,greater<int>());//从大到小 P(); return 0; }
运行结果:
二.Vector
vector和数组类似.
#include<iostream> #include<algorithm> #include <ctime> #include <vector> using namespace std; vector <int>v; void init() { v.clear(); for(int i=0;i<10;i++) v.push_back(rand()%100); } void P() { /** for(int i=0;i<10;i++) cout<<v[i]<<" "; */ static int t=0; if(t%2==0) cout<<"\nVector:"; else cout<<"拍序后:"; t++; vector<int>::iterator it; for(it=v.begin();it!=v.end();it++) { cout<<*it<<" "; } cout<<endl; } bool cmp(int x,int y) { return x>y;//和数组一样,从大到小 } int main() { srand(time(NULL)); init(); P();//默认从小到大 sort(v.begin(),v.end()); P(); init(); P();//自定义顺序 sort(v.begin(),v.end(),cmp); P(); init(); P();//从大到小 sort(v.begin(),v.end(),greater<int>()); P(); init(); P();//从小到大 sort(v.begin(),v.end(),less<int>()); P(); return 0; }
运行结果:
三.优先队列.
(一)优先队列
优先队列的自定义优先级或许是困扰开始学习优先队列的人.总是会和sort混淆.原因是没有弄清楚sort和priority_queue的默认优先级.sort默认从小到大排序.
priority_queue默认大的优先,所以队首的是最大的元素.
因为默认优先级相反,所以定义的方式也刚好相反.
代码:
#include<iostream> #include<algorithm> #include <ctime> #include <queue> using namespace std; priority_queue<int>q1;//默认大的优先 priority_queue<int, vector<int>, greater<int> >q2;//小的优先 priority_queue<int, vector<int>, less<int> >q3;//大的优先 void init() { for(int i=0;i<20;i++) { //int x=rand()%100; q1.push(rand()%100); q3.push(rand()%100); q2.push(rand()%100); } } void P(priority_queue<int>q) { while(!q.empty()) { cout<<q.top()<<" "; q.pop(); } cout<<endl; } void P(priority_queue<int, vector<int>, greater<int> >q) { while(!q.empty()) { cout<<q.top()<<" "; q.pop(); } cout<<endl; } int main() { srand(time(NULL)); init(); P(q1);//(默认)大的优先 P(q2);//小的优先 P(q3);//大的优先 return 0; }
运行结果:
(二.)结构体优先队列.
其实acm里用的最多的还是结构体的优先队列,特别是在搜索时.自定义优先级的时候,比较函数可以写在结构体(或类)里,此时必须要写重载"<"的友元函数.此处有两个重点.
(1)重载的必须是"<"符号,重载">"会出错.
(2)必须是友元函数.
下面看代码:
#include <iostream> #include <queue> #include <ctime> #include <algorithm> using namespace std; struct Node { int x, y; Node() {} Node( int x,int y):x(x), y(y) {} //x小的优先,相同时y小的优先 friend bool operator<(Node a, Node b) { if( a.x== b.x ) return a.y> b.y; return a.x> b.x; } }; struct cmp { //x小的优先,相同时y小的优先 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; srand(time(NULL)); for( int i= 0; i< 10; ++i ) q.push( Node( rand()%10, rand()%10 ) ); while( !q.empty() ) { cout << q.top().x << ' ' << q.top().y << endl; q.pop(); } cout<<"------------------------"<<endl; priority_queue<Node>qq; for( int i= 0; i< 10; ++i ) qq.push( Node( rand()%10, rand()%10 ) ); while( !qq.empty() ) { cout << qq.top().x << ' ' << qq.top().y << endl; qq.pop(); } return 0; }
运行结果:
相关文章推荐
- C++复习之运算符重载,数组排序,vector
- C++ 中对vector<T*> 数组的查找和排序
- c++中sort, priority_queue自有类型和自定义类型的排序规则
- vector,priority_queue对于自定义结构的排序方法
- PriorityQueue ,ArrayList , 数组排序
- C++中,自定义结构体vector的排序
- c++ stack,queue,vector用法
- C++ 用qsort()实现字符串数组元素排序
- C++ STL priority_queue
- 队列(queue)的链表(list)实现及循环数组(circular array)实现 C++实现
- C++ vector 排序
- Ignatius and the Princess I hdu 1026 priority_queue + bfs (vector)
- C/C++面试之算法系列--1~n无序数组时间复杂度为O(n)排序
- C++用数组和链表分别实现Queue
- C++STL priority_queue 学习
- C++ 学习之函数传参2:vector和数组传参
- C++ 优先级队列(priority_queue)
- C++ vector 排序
- [C++]vector嵌套实现2D数组
- C++中堆的应用:make_heap, pop_heap, push_heap, sort_heap, priority_queue