C++标准模板库之——sort函数
hello
,⼤家好啊!好久不见啊,前段时间忙着实习,好久没写博客啦,亿点点惭愧,哈哈哈O(∩_∩)O
前⾔:在使⽤sort之前,我们需要对我们⾃定义的排序规则了解⼀点,这就是如果我们⾃定义的排序规则返回值必须为bool类型,另外,如果返回值为true就不交换两个数的值,反之就交换。
下⾯我们看⼀下今天的重点,sort函数。这个函数我相信⼤家只要是编程,那必然是会⽤到的!!!然⽽,虽然说会⽤到,但也仅会简单的使⽤该函数,今天我们就更深⼊的了解⼀下这个函数。我相信,这篇⽂章对于初学C++,或者说正处于刷题阶段的你⼀定会有所帮助!!!(⼤佬请绕路~)
我们如果使⽤过sort函数,那么我们应该知道使⽤这个函数那么肯定要包含头⽂件 #include <algorithm>
⾸先,我们先来看⼀下sort函数的参数吧~
//第⼀个sort函数
template<typename _RandomAccessIterator>
inline void sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
//第⼆个⼈sort函数
template<typename _RandomAccessIterator,typename _Compare>
inline void sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
通过查看算法库(<algorithm>)我们可以看到⾥⾯有两个sort函数,⼀个是两个参数的sort,另⼀个是三个参数的sort函数。在我们平时的使⽤中,两个参数的sort函数使⽤的⽐较多,不过三个参数的sort函数我们同样应该掌握。
下⾯我们分别看⼀下~
两个参数的sort函数
使⽤之前,先介绍⼀下这两个参数的意义。这两个参数即是指你要遍历的起点和终点(前闭后开:即包括第⼀个不包括最后⼀个)
⾸先,我们看⼀下sort函数的最简单的⽤法,对基本数据类型进⾏排序~
例如:对数组vector<int> v({6,3,2,34,12,213,53})进⾏排序,我们可以这样使⽤sort函数,这种⽅法我相信⼤家都会使⽤
//基本数据类型测试:这⾥基本数据类型只是使⽤int来进⾏测试,其实使⽤char,float,double结果也都⼀样
#include<iostream>
#include<algorithm>
#include<vector>
namespace是干嘛的using namespace std;
int main()
{
vector<int>v({6,3,2,34,12,213,53});
sort(v.begin(), v.end());
system("pause");
return0;
}
这个排序使⽤很简单,这⾥就不再多说啦~
接着我们看完了基本数据类型的排序,我们再来看⼀下⾃定义数据类型的排序
对于⾃定义数据类型的排序,我们需要对< 运算符进⾏重载
例如:我们依据类⾥的数据对类进⾏排序
给定类为:
class A{
A():val(0),fre(0)
{
}
private:
int val;
int fre;
};
如果我们要想依据类⾥⾯的fre来进⾏排序的话,那么我们就需要对类A进⾏<;运算符重载。如果我们不重载<;运算符,我们怎么知道如何⽐较两个类A的值?对于两个参数的sort,我们⼀定是重载的⼩于号,注意⼀定是⼩于号,不是⼤于号!!!重载⽅式如下
class A
{
public:
A():val(0),fre(0)
{
}
bool operator<(A &Y)
{
return this->fre < Y.fre;
}
//成员变量
int val;
int fre;
};
重载了⼩于号后,我们就可以正常的使⽤sort函数了,即可以像之前那样正常使⽤
/
/⾃定义数据类型排序
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
class A
{
public:
A():val(0),fre(0)
{
}
bool operator<(A &Y)
{
return this->fre < Y.fre;
}
//成员变量
int val;
int fre;
};
int main()
{
vector<A> v2;
A a;
a.val =1;
a.fre =9;
v2.push_back(a);
a.val =2;
a.fre =1;
v2.push_back(a);
a.val =8;
a.fre =3;
v2.push_back(a);
a.val =6;
a.fre =9;
v2.push_back(a);
a.val =7;
a.fre =3;
v2.push_back(a);
a.val =5;
a.fre =2;
v2.push_back(a);
a.val =3;
a.fre =9;
v2.push_back(a);
sort(v2.begin(), v2.end());
system("pause");
return0;
}
不过我们重载⼩于号时,需要注意的就是,如果重载的返回值是true,那么在排序时就不进⾏交换,如果返回值是false,就进⾏交换。因此,我们在返回值时需要依据⾃⼰想从⼤到⼩排还是从⼩到⼤排来进⾏设计表达式。(例如:如果我想从⼩到⼤排列,那么返回值时我就需要返回this->fre < Y.fre ,从⼤到⼩排序则相反)(注:该类同样适⽤上⾯的函数模板)
两个参数的sort我们就先看这么多,下⾯我们继续看⼀下三个参数的sort
三个参数的sort
对于三个参数的sort,我们可以变化的⽅式就⽐较多了,我们⼀点点来看。
由于基本数据类型使⽤两个参数的sort就可以搞定,因此我们也就没必要使⽤第三个参数了,不过我们也可以使⽤看⼀下
使⽤之前,我们需要知道这个sort的三个参数是⼲嘛的。前两个参数和两个参数的sort意义⼀样,这第三个参数的作⽤就是相当于按照我们⾃定义的排序规则进⾏排序,这个参数可以是函数名,可以是对象名(注意区分类和对象)。
使⽤全局函数
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
//使⽤全局函数
bool cmp(int x,int y)
{
return x < y;
}
int main()
{
vector<int>v({6,3,2,34,12,213,53});
sort(v.begin(), v.end(), cmp);
system("pause");
return0;
}
注意:在⾃定义cmp函数⽐较规则时,函数的参数必须是和数组的参数类型⼀致,并且函数的返回值类型为bool类型;并且,函数有且仅有两个参数!!!
使⽤类成员函数
如果使⽤类的成员函数来⾃定义排序规则,该成员函数必须是静态的成员函数!!!因为类的静态成员函数是所有类共⽤的并且不需要创建对象就可调⽤!!!
定义类的成员函数
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
//使⽤类的成员函数
class MyCmp
{
public:
bool cmp(int a,int b)
{
return a < b;
}
};
int main()
{
vector<int>v({6,3,2,34,12,213,53});
sort(v.begin(), v.end(), MyCmp::cmp);
system("pause");
return0;
}
使⽤对象名
使⽤对象名时分为两种情况,即可以使⽤临时对象也可以使⽤⾃⼰创建的持续对象名来⾃定义排序规则。不过使⽤对象名时,我们需要注意的就是我们必须要对括号()操作符进⾏重载。因为这⾥既可以使⽤函数名也可以使⽤对象名的原因是利⽤了类的仿函数的思想。类的仿函数的思想即可以使类像⼀个函数⼀样使⽤。如果类可以像函数使⽤,那么必须要重载()运算符,并且该运算符的参数也必须有两个参数,该参数类型必须和数组的参数⼀致。
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
//使⽤对象名
class MyCmp
{
public:
bool operator()(int a,int b)
{
return a < b;
}
int val;
};
int main()
{
vector<int>v({6,3,2,34,12,213,53});
// sort(v.begin(), v.end(), MyCmp());//使⽤匿名对象名(也叫临时对象)
MyCmp m;
sort(v.begin(), v.end(), m);//使⽤持续对象名
system("pause");
return0;
}
因为我们这⾥只需要临时⽤到对象名来对数据排序,所以sort的第三个参数使⽤临时对象就⾜够了,也就没必要为了排序创建⼀个对象。
使⽤STL提供的模板类
stl为我们提供了模板类less和greater,less表⽰从⼩到⼤排序,greater表⽰从⼤到⼩排序。使⽤这两个模板类其实和我们上⾯⾃定义的类其实是⼀样的,只是这个类内部⾃动为我们重载了括号运算符,我们在使⽤的时候只需要告诉该模板类我们需要对何种参数类型进⾏排序即可。
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
//使⽤提供的less和greater类
int main()
{
vector<int>v({6,3,2,34,12,213,53});
sort(v.begin(), v.end(), less<int>());//使⽤stl提供的less模板类:从⼩到⼤排序
sort(v.begin(), v.end(), greater<int>());//使⽤stl提供的greater模板类:从⼤到⼩排序
system("pause");
return0;
}
结束语:好啦,sort的使⽤⼤概也就这么多,如果这⼏种⽅法⼤家都掌握,那么在以后的使⽤中绝对不是问题~
创作不易,欢迎各位⼤佬三连⽀持啊~ 点赞关注加收藏哦~ 如果有不⾜的地⽅,也欢迎各位⼤佬给⼩弟指出来~
以上排序案例都是经过⾃⼰⼿敲通过的,有需要可以⾃⼰尝试哦~
附全部源码

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。