原来只会使用sort函数,却没有对它进行深入思考和探索。
下面我想通过几个近期我对它的一些疑问,来深入浅出的谈谈这个sort函数。
目录
3.1【小于比较(LessThan comparable)】
3.2 【严格弱序(strict weak ordering)】
3.3 【严格弱序比较(strick weakly comparable)】
1. 如何使用sort 函数?
头文件 include <algorithm>
下面是sort 函数的定义,有两种,一种是默认的sort函数,一种是加入自定义比较函数的sort函数。可以看出来,这两个函数都需要传入两个可以随机访问的迭代器,也就意味着,能够用sort函数排序的容器,需要支持随机访问(目前容器中就vector,deque支持随机访问)。迭代器first指向第一个需要排序的元素,last指向最后一个需要排序元素的下一个位置。排序范围 [first, last).
下面是sort函数的两种定义:
default (1)
template <class RandomAccessIterator>
void sort (RandomAccessIterator first, RandomAccessIterator last);
custom (2)
template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
讲完迭代器,再讲讲比较函数或是泛函数,
(1)比较函数传入参数为两个值,对这两个值进行比较大小。
(2)仿函数(functors)在class(struct)中对小括号进行重载,里面两个数比较的方法。
它们都需要遵守【严格弱序比较(strict weakly comparable)】的原则(下面会具体讲)。返回值为bool类型。例如:
bool myfunction (int i,int j) { return (i<j); }
struct myclass {
bool operator() (int i,int j) { return (i<j);}
} myobject;
2. sort函数使用的底层排序算法是什么?
快速排序
不稳定排序算法。
时间复杂度O(nlog(n)).
3. 什么是严格弱序比较?
严格弱序比较这个概念听起来就比较抽象,生涩难懂ÿ