STL: set 和 priority_queue
来源:互联网 发布:淘宝防举报 编辑:程序博客网 时间:2024/06/08 06:53
- 优先级队列默认是底层为vector实现的heap
- set 基于平衡红黑树
- 两者插入元素时间复杂度都是O(log(n))
- 使用默认的greater 得到的结果不同
#include <iostream>#include <queue>#include <vector>#include <set>int main(){ using namespace std; vector<int>vec{1,3,5,78,4,23}; set<int, greater<int> > myset; priority_queue<int, vector<int>, greater<int> >myque; for(int i=0; i<6; ++i){ myset.insert(vec[i]); myque.push(vec[i]); } for(set<int, greater<int> >::iterator it=myset.begin() ; it!=myset.end(); ++it){ cout << *it <<" "; }//从大到小:78 23 5 4 3 1 cout << endl; for(int i=0; i<6; ++i){ cout << myque.top() <<" "; myque.pop(); }// 小顶堆: 1 3 4 5 23 78 getchar(); getchar(); return 0;}
优先级队列、sort、qsort 与 重载、自定义cmp函数的关系
#include <iostream>#include <string>#include <algorithm> // for sort()#include <queue> // for priority_queue#include <map>#include <set>using namespace std;/*************************************************************************/// 重载 < 运算class student_cmp{private: string name; int id;public: student_cmp(string name = "default", int id = 0) : name(name) , id(id) { ; } inline string get_name(){ return name; } inline int get_id(){ return id; } // priority_queue: id 大的优先级低, 从小到大排列 == greater<int> // vector sort 中 从大到小排 bool operator < (const student_cmp &s)const{ return this->id > s.id; } friend ostream &operator << (ostream & os, const student_cmp &s){ os << s.name << ": " << s.id << endl; return os; }};/**********************************************************************/// 没有重载< 运算, 使用自定义cmp函数class student_nocmp{private: string name; int id;public: student_nocmp(string name = "default", int id = 0) : name(name), id(id) { ; } inline string get_name(){ return name; } inline int get_id(){ return id; } friend ostream &operator << (ostream & os, const student_nocmp &s){ os << s.name << ": " << s.id << endl; return os; }};// 优先级队列:从小到大排列class mynocmp{public: bool operator ()(student_nocmp &a, student_nocmp &b) { return a.get_id() > b.get_id(); }};// for sort 必须返回bool类型// vector: 从大到小排列bool sort_nocmp (student_nocmp &a, student_nocmp &b){ return a.get_id() > b.get_id();}// for qsort 必须返回int类型, 参数是指针类型// array: 从大到小排列// 如果返回值小于0,则qsort 就得知第一个元素应该在前,如果返回值大于0,则第一个元素应该在后。// 相减顺序与参数一致就是从小到大排序int qsort_nocmp(const void *a, const void *b){ student_nocmp * p1, *p2; p1 = (student_nocmp *)a; p2 = (student_nocmp *)b; return p1->get_id() - p2->get_id();}/**********************************************************************/int main(){ cout << "overload operator < in priority_queue..." << endl; priority_queue<student_cmp> stuQueue; stuQueue.push(student_cmp()); stuQueue.push(student_cmp("zhangsan", 23)); stuQueue.push(student_cmp("lisi", 14)); stuQueue.push(student_cmp("laowang", 36)); stuQueue.push(student_cmp("xiaoming", 28)); while (!stuQueue.empty()){ cout << stuQueue.top(); stuQueue.pop(); } cout << endl; cout << "without overload operator < in priority_queue..." << endl; priority_queue<student_nocmp, vector<student_nocmp>, mynocmp> stunoQueue; stunoQueue.push(student_nocmp()); stunoQueue.push(student_nocmp("zhangsan", 23)); stunoQueue.push(student_nocmp("lisi", 14)); stunoQueue.push(student_nocmp("laowang", 36)); stunoQueue.push(student_nocmp("xiaoming", 28)); while (!stunoQueue.empty()){ cout << stunoQueue.top(); stunoQueue.pop(); } cout << endl; /******sort******************/ cout << "overload operator < in vector..." << endl; vector<student_cmp> veccmp; veccmp.push_back(student_cmp()); veccmp.push_back(student_cmp("zhangsan", 23)); veccmp.push_back(student_cmp("lisi", 14)); veccmp.push_back(student_cmp("laowang", 36)); veccmp.push_back(student_cmp("xiaoming", 28)); sort(veccmp.begin(), veccmp.end()); for (vector<student_cmp>::iterator it = veccmp.begin(); it != veccmp.end(); ++it) cout << *it; cout << endl; cout << "without overload operator < in vector..." << endl; vector<student_nocmp> vecnocmp; vecnocmp.push_back(student_nocmp()); vecnocmp.push_back(student_nocmp("zhangsan", 23)); vecnocmp.push_back(student_nocmp("lisi", 14)); vecnocmp.push_back(student_nocmp("laowang", 36)); vecnocmp.push_back(student_nocmp("xiaoming", 28)); sort(vecnocmp.begin(), vecnocmp.end(), &sort_nocmp); for (vector<student_nocmp>::iterator it = vecnocmp.begin(); it != vecnocmp.end(); ++it) cout << *it; cout << endl; cout << "without overload operator < in array..." << endl; student_nocmp arrnocmp[5] = { student_nocmp(), student_nocmp("zhangsan", 23), student_nocmp("lisi", 14), student_nocmp("laowang", 36), student_nocmp("xiaoming", 28) }; qsort(arrnocmp, 5, sizeof(student_nocmp), &qsort_nocmp); for (int i = 0; i < 5; ++i) cout << arrnocmp[i]; getchar(); return 0;}
结果:
结论:
1. 优先级队列定义的< 运算 规定低优先级, 返回为ture的条件说明优先级低;
2. 类外部定义的cmp相当于实现重载operator <;
3. 由于qsort返回值是int型, /如果返回值小于0,则qsort 就得知第一个元素应该在前,如果返回值大于0,则第一个元素应该在后。即,相减顺序与参数一致就是从小到大排序;
4. sort 的效率比qsort高, 还是使用sort 就好了;
0 0
- STL: set 和 priority_queue
- STL set和priority_queue使用方法
- stl的multiset和set和priority_queue区别
- STL优先级队列(priority_queue)和集合(set)的使用
- STL之queue和priority_queue
- 【C++ STL】queue和priority_queue
- STL 整理map、set、vector、list、stack、queue、deque、priority_queue
- STL中sort、priority_queue、map、set的自定义比较函数
- STL中sort、priority_queue、map、set的自定义比较函数
- STL详解(vector,list,deque,stack,queue,priority_queue;map,set)
- STL set,map , priority_queue 及 lower_bound 的排序比较函数
- STL--priority_queue
- STL【priority_queue】
- stl-priority_queue
- STL priority_queue
- STL Priority_Queue
- stl priority_queue
- stl priority_queue
- 图 简单滴C++邻接表 无向图
- 【当你想放弃时,看看这个漫画!】
- 蓝桥杯ALGO-3K好数
- Spring - Java/J2EE Application Framework 应用框架 第 7 章 事务管理
- 使用vi更改(查看)文件编码及批量替换文件中的字符(串)
- STL: set 和 priority_queue
- 从零开始学Scala系列(一)之环境安装及IDE选择安装
- 201. Bitwise AND of Numbers Range
- Java老鸟遇到的坑--java基础类型对应的包装类比较大小
- Spring - Java/J2EE Application Framework 应用框架 第 8 章 源代码级的元数据支持
- [XJB出题] [线段树] [差分数组] [模拟] 掀桌子(reverse)
- python 打包工具
- CSS属性之margin
- SpringMVC之简单hello搭建