您的位置:首页 > 产品设计 > UI/UE

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; } 还可以在构造函数中进行比较运算符的初始化。 例如:

#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

#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; } 令一种比较函数的声明方式,在构造函数中初始化:

#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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐