其实首先是转载的:
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
|
相对稳定的使得符合某个条件的元素放在前面
|
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非常漂亮