sort函数的用法:
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
日常使用的时候,基本上,我们只会用到前面两个参数,分别代表的是排序的起始位置和终止位置,sout的第三个参数表示的是排序的规则,很多时候,往往我们的需求不仅仅是要求从小到大排序,此时,我们就可以自定义排序规则,通过自定义comp函数,达到排序目的;
comp函数可以自己编写,以适应不同的数据结构。比如要排列一个结构体,采用降序排列;
#include <algorithm>
struct range
{
int start;
int end;
range(): {start(0), end(0)}
range(int a, int b): {start(a), end(b)}
};
bool comp(range a, range b)//比较函数的返回值一定是bool型,并且入口参数暂时到现在是两个,暂时没有更高的需要情景,以后可以补充
{
return a.start>b.start;//想按什么情况来排序,就是这种情况下返回的值是true,但是这里面似乎不能用>=或者<=这样的符号
}
vector<range> r(10,a);
sort(r.begin(), r.end(), comp);
也可以使用C++库中已有的排序函数,在头文件中,有equal_to、not_equal_to、greater、greater_equal、less、less_equal,可以直接作为comp函数
sort(A,A+100,greater<int>());//降序排列
sort(A,A+100,less<int>());//升序排列
sort的使用场合
并不是所有的容器都适用于sort的自定义排序,有些容器自带排序函数,如list;
sort函数使用类内类外的区别
上面介绍的一直是sort函数在类外的使用方法。当sort函数在类内使用,并且定义comp函数也是类成员函数时,必须要在comp函数前加static,因为sort需要传入的参数是一个普通函数指针,而不是成员函数指针,所以需要在类成员定义前加static。如下
class trans
{
private:
struct coordinate
{
double x;
double y;
double z;
double i;
double j;
double k;
int id;
};
list<coordinate> point;
int read_data(ifstream &ifs, list<coordinate> &point);
static bool comp(coordinate a, coordinate b);//加static
int sort_by_x(list<coordinate> &point);
int write_data(ofstream &ofs, list<coordinate> point, CString CC_VC, int num);
public:
int trans_style(CString inputpath, CString outputpath, CString CC_CV, int num);
};
- 注意:为什么定义comp函数也是类成员函数时,必须要在comp函数前加static
其实这并不是sort函数规定的,而是所有的的普通类成员函数,都不能以函数指针的方式作为其他函数的入口参数,因为普通成员函数在编译阶段,会自动添加了入口参数,这样这个函数指针的模板其实就改变了,比如举个例子:
class C
{
public:
bool compare(int a, int b)
{
return a > b;
}
int test()
{
int a[10] = { 9, 6, 3, 8, 5, 2, 7, 4, 1, 0 };
for (int i = 0; i < 10; i++)
cout << a[i] << endl;
sort(a, a + 10, compare);//在这里就不需要对compare函数传入参数了
for (int i = 0; i < 10; i++)
cout << a[i] << endl;
return 0;
}
};
经过编译以后,变成了:
bool compare(C *this, int a, int b)