C++ STL std::sort() 及其campare()函数

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 大于等于
需要注意的是,这些函数不是都能适用于你的sort算法,如何选择,决定于你的应用。

另外,不能直接写入仿函数的名字,而是要写其重载的()函数,如:

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


猜你喜欢

转载自blog.csdn.net/qq_23502651/article/details/80160414