STL Sort算法

来源:互联网 发布:c经典排序算法 编辑:程序博客网 时间:2024/05/16 09:03

其实首先是转载的:

STL提供的Sort 算法
     C++之所以得到这么多人的喜欢,是因为它既具有面向对象的概念,又保持了C语言高效的特点。STL 排序算法同样需要保持高效。因此,对于不同的需求,STL提供的不同的函数,不同的函数,实现的算法又不尽相同。
                1.1 所有sort算法介绍

所有的sort算法的参数都需要输入一个范围,[begin, end)。这里使用的迭代器(iterator)都需是随机迭代器(RadomAccessIterator), 也就是说可以随机访问的迭代器,如:it+n什么的。(partition和stable_partition 除外)
如果你需要自己定义比较函数,你可以把你定义好的仿函数(functor)作为参数传入。每种算法都支持传入比较函数。以下是所有STL sort算法函数的名字列表:
功能描述
sort
对给定区间所有元素进行排序
stable_sort
对给定区间所有元素进行稳定排序
partial_sort
对给定区间所有元素部分排序
partial_sort_copy
对给定区间复制并排序
nth_element
找出给定区间的某个位置对应的元素
is_sorted
判断一个区间是否已经排好序
partition
使得符合某个条件的元素放在前面
stable_partition
相对稳定的使得符合某个条件的元素放在前面
其中nth_element 是最不易理解的,实际上,这个函数是用来找出第几个。例如:找出包含7个元素的数组中排在中间那个数的值,此时,我可能不关心前面,也不关心后面,我只关心排在第四位的元素值是多少。

1.2 sort 中的比较函数
当你需要按照某种特定方式进行排序时,你需要给sort指定比较函数,否则程序会自动提供给你一个比较函数。
vector < int > vect;
//...
sort(vect.begin(), vect.end());
//此时相当于调用
sort(vect.begin(), vect.end(), less<int>() );
上述例子中系统自己为sort提供了less仿函数。在STL中还提供了其他仿函数,以下是仿函数列表:
功能描述
equal_to
相等
not_equal_to
不相等
less
小于
greater
大于
less_equal
小于等于
greater_equal
大于等于
需要注意的是,这些函数不是都能适用于你的sort算法,如何选择,决定于你的应用。另外,不能直接写入仿函数的名字,而是要写其重载的()函数:
less<int>()
greater<int>()
当你的容器中元素时一些标准类型(int float char)或者string时,你可以直接使用这些函数模板。但如果你时自己定义的类型或者你需要按照其他方式排序,你可以有两种方法来达到效果:一种是自己写比较函数。另一种是重载类型的'<'操作赋。

#include <iostream>#include <algorithm>#include <functional>#include <vector>using namespace std; class myclass {        public:        myclass(int a, int b):first(a), second(b){}        int first;        int second;        bool operator < (const myclass &m)const {                return first < m.first;        }}; bool less_second(const myclass & m1, const myclass & m2) {        return m1.second < m2.second;} int main() {               vector< myclass > vect;        for(int i = 0 ; i < 10 ; i ++){                myclass my(10-i, i*3);                vect.push_back(my);        }        for(int i = 0 ; i < vect.size(); i ++)        cout<<"("<<vect[i].first<<","<<vect[i].second<<")\n";        sort(vect.begin(), vect.end());        cout<<"after sorted by first:"<<endl;        for(int i = 0 ; i < vect.size(); i ++)        cout<<"("<<vect[i].first<<","<<vect[i].second<<")\n";        cout<<"after sorted by second:"<<endl;        sort(vect.begin(), vect.end(), less_second);        for(int i = 0 ; i < vect.size(); i ++)        cout<<"("<<vect[i].first<<","<<vect[i].second<<")\n";               return 0 ;}

接下来这部分是我原创的,我自己写了一个小小的程序,用以学习sort


#include<iostream>#include<vector>#include<functional>#include<algorithm>using namespace std;bool less_second(const int& a, const int &b) {return a < b;}bool greater_second(const int& a, const int &b) {return a > b;}int main() {vector<int> a(10);for(int i = 0; i < 10; i++) a[i] = 10 - i;for(int i = 0; i < 10; i++) cout<<a[i]<<" ";cout<<endl;sort(a.begin(), a.end(), less_second);for(int i = 0; i < 10; i++) cout<<a[i]<<" ";cout<<endl;sort(a.begin(), a.end(), greater_second);for(int i = 0; i < 10; i++) cout<<a[i]<<" ";return 0;}

发现STL真的非常非常好用, Algorithm非常漂亮


原创粉丝点击