sort()排序函数

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)

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值