STL中sort、priority_queue、map、set的自定义比较函数
STL中,sort的默认排序为less,也就是说从小到大排序;priority_queue默认是less,也就说大顶堆;map默认是less,也就说用迭代器迭代的时候默认是小的排在前面;set默认是less,也就是说用迭代器迭代的时候是从小到大排序的。
1、sort
#include <stdio.h>
#include <algorithm>
#include <functional>
using namespace std; bool comp(const int& a, const int& b ){
return a < b ; //从小到大
}
struct cmp{
bool operator()( const int& a , const int& b ) const{
return a < b ; //从小到大
}
} ; int main(){
int array[] = {1 ,5 ,4, 10 , 3, 6 } ;
sort( array , array+6 ) ; //以默认的less<int>()排序
sort( array , array+6 , greater<int>() ) ; //从大到小排序
sort( array , array+6 , comp ) ;
sort( array , array+6 , cmp() ) ;//使用仿函数
for(int i=0;i<6;++i) printf("%d ",array[i]); printf("\n");
return 0 ;
}
2、priority_queue
#include <stdio.h>
#include <queue>
using namespace std ; struct cmp{
bool operator()( const int& a , const int& b )const{
return a < b ; //大顶堆
}
};
struct Node{
int x, y ;
Node(int _x, int _y ):x(_x),y(_y){}
bool operator <(const Node& n1)const{
if( x < n1.x ) return true ; //按照x为第一关键字由大到小排序
else if( x == n1.x ) return y < n1.y ; //y为第二关键字由大到小排序
else return false ;
}
} ; int main(){
//priority_queue<int> q ; //优先队列默认是less,大顶堆 ;
//priority_queue<int,vector<int> ,cmp> q ;
priority_queue< Node > q ; for(int i=0;i<10;i++) q.push( Node( rand() , rand() ) );
while( !q.empty() ){
printf("%d %d\n",q.top().x , q.top().y ) ;
q.pop() ;
}
return 0 ;
}
还可以在构造函数中进行比较运算符的初始化。
例如:
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
//小根堆
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int ia[]={,,,,,,,,};
priority_queue<int,vector<int>,bool (*)(int,int)> ipq(ia,ia+,cmp); //默认参数要从左到右开始指定
cout<<"size=" <<ipq.size()<<endl; for(int i=;i<ipq.size();++i)
cout<<ipq.top()<<' ';
cout<<endl;
while(!ipq.empty())
{
cout<<ipq.top()<<' ';
ipq.pop();
}
cout<<endl;
}
3、map
#include<stdio.h>
#include <map>
using namespace std; struct cmp{
bool operator()( const int& a, const int& b ) const{
return a < b ; //从小到大;
}
};
int main(){
//map<int, int,greater<int> > mp ; //从大到小
map<int , int ,cmp> mp ;
for(int i=0;i<10;++i) mp.insert( map<int,int,cmp >::value_type(rand() ,i) ) ;
map<int, int, cmp >::iterator it = mp.begin() ;
for( ;it!=mp.end() ;it++) printf("%d %d\n",(*it).first , (*it).second );
return 0 ;
}
4、set
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <set> using namespace std; struct cmp{
bool operator()( const int& a , const int& b )const{
return a < b ; //从小到大
}
} ; int main(){
//set<int > s ;
set<int,cmp> s ;
for(int i=0;i<10;i++) s.insert( rand() ) ;
set<int,cmp>::iterator it = s.begin() ;
for( ; it!=s.end();it++)
printf("%d\n",*it);
return 0 ;
}
令一种比较函数的声明方式,在构造函数中初始化:
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <set> using namespace std; struct cmp{
bool operator()( const int& a , const int& b )const{
return a < b ; //从小到大
}
} ;
bool mycmp(int a,int b)
{
return a<b;
}
int main(){
//set<int > s ;
set<int,decltype(mycmp)*> s(mycmp) ;
for(int i=;i<;i++) s.insert( rand() ) ;
set<int,cmp>::iterator it = s.begin() ;
for( ; it!=s.end();it++)
printf("%d\n",*it);
return ;
}
STL中sort、priority_queue、map、set的自定义比较函数的更多相关文章
- STL中stack/queue/map以及Boost unordered_map 的使用方法
一.stackstack 模板类的定义在<stack>头文件中.stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要的,在不指定容器类型时,默认的容器类型 ...
- STL中set和map
set 可以认为是数学上的集合,集合中的元素不允许有重复.set特有的操作是高效的插入.删除和执行基本查找. set的插入方法是 insert,由于集合元素的唯一性,insert操作不一定会成功,in ...
- 『嗨威说』算法设计与分析 - STL中Sort函数的实现原理初探
本文索引目录: 一.对Sort算法实现的个人阅读体会 二.Sort算法使用的三个排序算法的优点介绍 2.1 插入排序的优缺点 2.2 堆排序的优缺点 2.3 快速排序的优缺点 2.4 新的结合排序—— ...
- STL中sort排序算法第三个参数_Compare的实现本质
关于C++ STL vector 中的sort排序算法有三种自定义实现,它们本质上都是返回bool类型,提供给sort函数作为第三个参数. 重载运算符 全局的比较函数 函数对象 我认为从实现方式看,重 ...
- STL中vector,Map,Set的实现原理
vector的数据安排以及操作方式,与array非常类似,两者唯一的区别是空间运用的灵活性,array是静态空间,一旦配置了就不能改变,如果你想要大一点的空间,就必须首先配置一块新空间,然后将原来的元 ...
- C/C++知识要点2——STL中Vector、Map、Set容器的实现原理
1.Vector是顺序容器.是一个动态数组.支持随机存取.插入.删除.查找等操作,在内存中是一块连续的空间.在原有空间不够情况下自己主动分配空间.添加为原来的两倍.vector随机存取效率高,可是在v ...
- C++中防止STL中迭代器失效——map/set等关联容器——vector/list/deque等序列容器—如何防止迭代器失效—即erase()的使用
序列性容器::(vector和list和deque) erase迭代器不仅使所有指向被删元素的迭代器失效,而且使被 删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方 式, ...
- STL中vector、list、deque和map的区别
1 vector 向量 相当于一个数组 在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capac ...
- C++STL中的unique函数解析
一.总述 unique函数属于STL中比较常用函数,它的功能是元素去重.即”删除”序列中所有相邻的重复元素(只保留一个).此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了(详细情 ...
随机推荐
- VUE的两种跳转push和replace对比区别
router.push(location) 在vue.js中想要跳转到不同的 URL,需要使用 router.push 方法. 这个方法会向 history 栈添加一个新的记录,当用户点击浏览器后退按 ...
- 修改phpmyadmin不能导入大文件的限制
情景:我需要导入一张1.03GB的数据表,但是phpmyadmin导入文件默认为不能超过2M.因此需要修改phpmyadmin导入文件的大小限制. 1.phpmyadmin的导入也就是php完成文件上 ...
- 移动端mate标签设置
<meta name="viewport" content="width=device-width,height=device-height,initial-sca ...
- Django—Cookie and Session
一.Cookie Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密). 1. 应用 服务器可以利用Co ...
- 面对IBM与亚马逊的犄角攻势,微软云如何招架?
亚马逊AWS和微软Azure是全球公有云的焦点.不就前公布的财报不久前公布的财报,这两家公司云计算的收入越来越接近,从数据显示来看,亚马逊的利润比微软稍高,有人称微软云的高增长来自于捆绑销售,背后真正 ...
- 如何阅读 Redis 源码?ZZ
原文链接 在这篇文章中, 我将向大家介绍一种我认为比较合理的 Redis 源码阅读顺序, 希望可以给对 Redis 有兴趣并打算阅读 Redis 源码的朋友带来一点帮助. 第 1 步:阅读数据结构实现 ...
- Linux入门-1 常用命令
写在前面 当年初学Linux的时候,在网上找到nash_su大神的一套视频,讲的特别好,基础部分看了好几遍,很多知识点让我受益至今. 十分庆幸当年的选择,也十分感谢nash_su大神,祝你事事顺心,每 ...
- 纯CSS画的基本图形
图形包括基本的矩形.圆形.椭圆.三角形.多边形,也包括稍微复杂一点的爱心.钻石.阴阳八卦等.当然有一些需要用到CSS3的属性,所以在你打开这篇文章的时候,我希望你用的是firefox或者chrome, ...
- Web博文目录
前言 博客写的多了,自己翻起来也费劲,这里就进行一下整合. 以前设想自己做DBA,做运维,没想到最后还要走开发这条路,干一行就爱一行...学的扎实点,工作起来也会轻松.—— 送给奋斗的自己 1 Jav ...
- Starting MySQL.. ERROR! The server quit without updating PID file (/var/mysql/data/feng.pid). 问题解决方案
1.首先应该想到 授权 chown -R mysql:mysql /var/mysql/data 给mysql 用户 2.vim /etc/my.cnf [mysqld] datadir = /va ...