0.胡乱说说
因为要用到make_heap()了,然后发现自己不会写那个比较的函数,于是就来补一补std::sort()的一些基本操作。
1.函数特性
1.0 #include <algorithm>
1.1 非常优秀的时间复杂度:最坏情况接近 Nlog(N)
1.2 要求输入一个范围 [first, last)
1.3 随机迭代器,能用此算法的容器是支持随机访问的容器:vector, deque, string, 。
2.函数原型
template <class RandomAccessIterator>
void sort ( RandomAccessIterator first, RandomAccessIterator last );
template <class RandomAccessIterator, class Compare>
void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
第一个版本使用operator<进行比较,默认升序排序。
第二个版本使用comp做比较,它可以是函数指针,也可以是函数对象。
函数对象(Function Object),是重载了operator()函数的类(或结构体)实例化出来的对象,使用起来像函数,又叫仿函数。
关于参数comp,comp带两个同类型的参数,如果第一个参数排在第二个参数前面,返回true,否则返回false
3.STL提供的仿函数
名称 | 功能描述 |
---|---|
equal_to | 相等 |
not_equal_to | 不相等 |
less | 小于 |
greater | 大于 |
less_equal | 小于等于 |
greater_equal | 大于等于 |
另外,不能直接写入仿函数的名字,而是要写其重载的()函数,如:
less<int>()
greater<string>()
vector <int> v;
sort(v.begin(), v.end());
sort(v.begin(), v.end(), less<int>());
4.三种自定义排序方式的方法
// 排序元素,比较的对象
struct Person {
Person(int id, const string& name, int age)
: _id(id), _name(name), _age(age){}
int _id;
string _name;
int _age;
};
// 方式1:重载operator<用于排序时的比较(写在结构体内)
bool operator< (const Person& p1) {
return this->_d < p1.id;
}
// 排序函数写法,默认调用operator<
sort(members.begin(), members.end());
// 方式2:写比较函数
bool CompAge(const Person& p1, const Person& p2) {
return p1._age < p2._age;
}
// 排序时传入比较函数指针
sort(members.begin(), members.end(), CompAge);
// 方式3:仿函数
struct CompName{
bool operator()(const Person& p1, const Person& p2){
return p1._name < p2._name;
}
};
// 排序时传入函数对象
sort(members.begin(), members.end(), CompName());
5.其他sort()函数
函数名 | 功能描述 |
---|---|
sort | 对给定区间所有元素进行排序 |
stable_sort | 对给定区间所有元素进行稳定排序 |
partial_sort | 对给定区间所有元素部分排序 |
partial_sort_copy | 对给定区间复制并排序 |
nth_element | 找出给定区间的某个位置对应的元素 |
is_sorted | 判断一个区间是否已经排好序 |
partition | 使得符合某个条件的元素放在前面 |
stable_partition | 相对稳定的使得符合某个条件的元素放在前面 |
具体怎么用emmmm以后再学(flag
5.参(ban)考(yun)1、https://blog.csdn.net/bz201/article/details/543001
2、https://blog.csdn.net/hzyong_c/article/details/7791415