C++中sort函数的基础入门使用教程
前言
STL主要包含容器,迭代器,算法三块内容,用户可以对容器进行一系列的操作,比如遍历和计算,而STL提供的迭代器和容器完美地提供了这样的接口。其中std::vector是最常用的容器之一,vector是一个模板类,定义在命名空间namespace下,使用vector需要在包含相关头文件。今天主要讲解对vector的排序的使用。
sort类函数:
函数名
功能描述
需要头文件
语法描述:sort(begin,end,cmp),cmp参数可以没有,如果没有默认非降序排序。
常见的排序算法有快速排序、冒泡排序、归并排序等。STL中sort函数的实现跟STL的版本有关,而往往sort函数是由多种排序算法混合而成的。
1.vector元素为内置数据类型
STL中sort函数的使用方法如下,默认对容器进行从小到大的排序。
#include//std::vector #include //std::sort intmain(){ std::vector vi{2,0,1,8,1,2,1,5}; std::sort(vi.begin(),vi.end());//相当于std::sort(vi.begin(),vi.end(),std::less ()); for(inti=0;i 当然也可以指定对容器进行从大到小的排序:
#include//std::vector #include //std::sort intmain(){ std::vector vi{2,0,1,8,1,2,1,5}; std::sort(vi.begin(),vi.end(),std::greater ()); for(inti=0;i 2.vector元素为用户自定义数据类型
如果vector内的元素为用户自定义类型,并且用户想要按照自定义类型的某些组合特性进行排序。先来看看sort函数的定义:
templatevoidsort(RandomAccessIteratorfirst,RandomAccessIteratorlast,Comparecomp); 其中前两个参数为迭代器类型,第三个参数为比较函数。下面的例子中,类Character拥有两个属性,age_和name_,这里为了简单起见,变量均为public。现在需要对一个元素类型为Character的vector进行按照Character的age_从小打到进行排序。
classCharacter{ public: Character(intn,strings):age_(n),name_(s){} intage_; stringname_; }; classCompare{ public: booloperator()(Character*ca,Character*cb){ returnca->age_age_; } }; intmain(){ vector vc{newCharacter(1,"sasaki"),newCharacter(2,"nozomi"),newCharacter(1,"satchel"),newCharacter(6,"qingtian")}; sort(vc.begin(),vc.end(),Compare()); for(inti=0;i name_.c_str()); } return0; }//output:sasakisatchelnozomiqingtian 对于sort的第三个函数,用户可以自己定义任何类型的比较方式,但是需要满足strictweakordering的条件:
Xa; Xb; Condition:TestResult aisequivalenttob:Compare(a,b)falseCompare(b,a)false aislessthanbCompare(a,b)trueCompare(b,a)false bislessthanaCompare(a,b)falseCompare(b,a)true上述例子中的Compare函数基于Character对象的age_变量值进行比较。根据strictweakordering的条件,对vector按照某种条件进行排序就比较好理解了。
对于vector的两个元素a,b,如果a必须排在b前面,需要满足下面的条件:Compare(a,b)=true,Compare(b,a)=false;如果满足Compare(a,b)=false&Compare(b,a)=false,则说明两个元素是相等的;
拓展:对vector中的元素进行排序,使得age_为1的元素排在前面,age_!=1的元素排在后面;
分析:这种情况下Character被分为两类,age_==1和age_!=1;对于任意两个Character对象a,b:
1.相等(a==b):a->age_==1&&b->age_==1,或者a->age_!=1&&b->age_!=1;
2.小于(aage_==1&&b->age_!=1;
classCompare{ public: booloperator()(Character*ca,Character*cb){ if(ca->age_==1&&cb->age_==1|| ca->age_!=1&&cb->age_!=1)returnfalse; returnca->age_==1; } };完整的测试代码:
classCharacter{ public: Character(intn,strings):age_(n),name_(s){} intage_; stringname_; }; classCompare{ public: booloperator()(Character*ca,Character*cb){ if(ca->age_==1&&cb->age_==1|| ca->age_!=1&&cb->age_!=1)returnfalse; returnca->age_==1; } }; intmain(){ vectorvc{newCharacter(1,"sasaki"),newCharacter(2,"nozomi"),newCharacter(1,"satchel"),newCharacter(6,"qingtian")}; sort(vc.begin(),vc.end(),Compare()); for(inti=0;i name_.c_str()); } return0; }//output:sasakisatchelnozomiqingtian Reference:
1.std::sort
2.comparator
3.strictweakorder
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。