1.sort函数用法
C++reference中,最复杂的重载函数定义如下:
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare 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++库中已有的排序函数,在<functional>头文件中,有equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>,可以直接作为comp函数
sort(A,A+100,greater<int>());//降序排列
sort(A,A+100,less<int>());//升序排列
2.sort函数使用场合
不是所有的容器直接用sort函数的,有些容器自带有sort函数,不能使用sort(name.begin(), name.end(), comp),只要用name.sort(comp)即可,比如list容器。
3.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;
}
};
经过编译以后,cmp函数变为如下形式:
bool compare(C *this, int a, int b)
而sort应该接收这样bool compare(int a, int b)模板的函数指针,所以会编译报如下的错误:
第一个错误就是sort找不到接收bool compare(C *this, int a, int b)模板指针作为入口参数的函数模板
第二个错误就是不认为这边compare是函数入口参数,而认为是函数调用,所以缺少函数列表。
而静态成员函数是没有this指针的,所以可以使用。
这篇文章可以作为参考,原理是一样的:https://blog.csdn.net/this_capslock/article/details/17001003#commentBox