STL提供的Sort 算法


所属类别:开发技术

文章作者:lovekiky2006

特别推荐:免费发布信息 承包关键词~~抢爆了!HOT!


1 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() );上述例子中系统自己为sort提供了less仿函数。在STL中还提供了其他仿函数,以下是仿函数列表:名称功能描述equal_to相等 not_equal_to不相等 less小于 greater大于 less_equal小于等于 greater_equal大于等于 需要注意的是,这些函数不是都能适用于你的sort算法,如何选择,决定于你的应用。另外,不能直接写入仿函数的名字,而是要写其重载的()函数: less()greater()当你的容器中元素时一些标准类型(int float char)或者string时,你可以直接使用这些函数模板。但如果你时自己定义的类型或者你需要按照其他方式排序,你可以有两种方法来达到效果:一种是自己写比较函数。另一种是重载类型的'<'操作赋。 #include #include #include #include using namespace std;class myclass { public: myclass(int a, int b):first(a), second(b){} intfirst; intsecond; bool operator < (const myclass &m)const { returnfirst < m.first; }};bool less_second(constmyclass & m1, const myclass & m2) { returnm1.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 ;}

本文出自 51CTO.COM技术博客

相关信息

· 如何避免Java程序的数据脏读问题?

· /initrd目录的作用和当删除时出现的错误

· 一天

· 打造全自动的拨号上网服务器








....

52734 93543