STL中sort、priority_queue、map、set的自定义比较函数
2015-04-09 13:03
405 查看
STL中,sort的默认排序为less,也就是说从小到大排序;priority_queue默认是less,也就说大顶堆;map默认是less,也就说用迭代器迭代的时候默认是小的排在前面;set默认是less,也就是说用迭代器迭代的时候是从小到大排序的。
1、sort
#include<stdio.h>
#include<algorithm>
#include<functional>
usingnamespacestd;
boolcomp(constint&a,constint&b){
returna<b;//从小到大
}
structcmp{
booloperator()(constint&a,constint&b)const{
returna<b;//从小到大
}
};
intmain(){
intarray[]={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(inti=0;i<6;++i)printf("%d",array[i]);printf("\n");
return0;
}
2、priority_queue
#include<stdio.h>
#include<queue>
usingnamespacestd;
structcmp{
booloperator()(constint&a,constint&b)const{
returna<b;//大顶堆
}
};
structNode{
intx,y;
Node(int_x,int_y):x(_x),y(_y){}
booloperator<(constNode&n1)const{
if(x<n1.x)returntrue;//按照x为第一关键字由大到小排序
elseif(x==n1.x)returny<n1.y;//y为第二关键字由大到小排序
elsereturnfalse;
}
};
intmain(){
//priority_queue<int>q;//优先队列默认是less,大顶堆;
//priority_queue<int,vector<int>,cmp>q;
priority_queue<Node>q;
for(inti=0;i<10;i++)q.push(Node(rand(),rand()));
while(!q.empty()){
printf("%d%d\n",q.top().x,q.top().y);
q.pop();
}
return0;
}
还可以在构造函数中进行比较运算符的初始化。
例如:
3、map
#include<stdio.h>
#include<map>
usingnamespacestd;
structcmp{
booloperator()(constint&a,constint&b)const{
returna<b;//从小到大;
}
};
intmain(){
//map<int,int,greater<int>>mp;//从大到小
map<int,int,cmp>mp;
for(inti=0;i<10;++i)mp.insert(map<int,int,cmp>::value_type(rand(),i));
map<int,int,cmp>::iteratorit=mp.begin();
for(;it!=mp.end();it++)printf("%d%d\n",(*it).first,(*it).second);
return0;
}
4、set
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<set>
usingnamespacestd;
structcmp{
booloperator()(constint&a,constint&b)const{
returna<b;//从小到大
}
};
intmain(){
//set<int>s;
set<int,cmp>s;
for(inti=0;i<10;i++)s.insert(rand());
set<int,cmp>::iteratorit=s.begin();
for(;it!=s.end();it++)
printf("%d\n",*it);
return0;
}
令一种比较函数的声明方式,在构造函数中初始化:
1、sort
2、priority_queue
#include<queue> #include<vector> #include<iostream> #include<algorithm> usingnamespacestd; //小根堆 boolcmp(inta,intb) { returna>b; } intmain() { intia[9]={0,1,2,3,4,8,9,3,5}; priority_queue<int,vector<int>,bool(*)(int,int)>ipq(ia,ia+9,cmp);//默认参数要从左到右开始指定 cout<<"size="<<ipq.size()<<endl; for(inti=0;i<ipq.size();++i) cout<<ipq.top()<<''; cout<<endl; while(!ipq.empty()) { cout<<ipq.top()<<''; ipq.pop(); } cout<<endl; }
3、map
4、set
#include<stdio.h> #include<iostream> #include<algorithm> #include<set> usingnamespacestd; structcmp{ booloperator()(constint&a,constint&b)const{ returna<b;//从小到大 } }; boolmycmp(inta,intb) { returna<b; } intmain(){ //set<int>s; set<int,decltype(mycmp)*>s(mycmp); for(inti=0;i<10;i++)s.insert(rand()); set<int,cmp>::iteratorit=s.begin(); for(;it!=s.end();it++) printf("%d\n",*it); return0; }
相关文章推荐
- STL中sort、priority_queue、map、set的自定义比较函数
- STL中sort、priority_queue、map、set的自定义比较函数
- STL set,map , priority_queue 及 lower_bound 的排序比较函数
- STL priority_queue sort 自定义比较终极模板
- C++的STL模板set,multiset,map,multimap,deque,list,stack,queue和priority_queue
- STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)
- STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)
- STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)
- STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)
- STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)
- STL 整理map、set、vector、list、stack、queue、deque、priority_queue
- STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)(转)
- STL 收拾(map、set、vector、list、stack、queue、deque、priority_queue)...
- STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)(转)
- STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)
- STL中比较常用的容器是vector,set和map,比较常用的算法有Sort等。
- STL中set、map的比较函数
- STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)
- STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)
- STL 整理(map、set、vector、list、stack、queue、deque、priority_queue)(转)