STL中排序函数详解

排序(sort):所有sort算法介绍:使用的迭代器(iterator)都需是随机迭代器(RadomAccessIterator)

1.      所有

函数名功能描述

sort对给定区间所有元素进行排序

stable_sort对给定区间所有元素进行稳定排序

partial_sort对给定区间所有元素部分排序

partial_sort_copy对给定区间复制并排序

nth_element找出给定区间的某个位置对应的元素

is_sorted判断一个区间是否已经排好序

partition使得符合某个条件的元素放在前面

stable_partition相对稳定的使得符合某个条件的元素放在前面

2.      比较函数:当你需要按照某种特定方式进行排序时,你需要给sort指定比较函数,否则程序会自动提供给你一个比较函数。

vector < int > vect;

//...

sort(vect.begin(), vect.end());

//此时相当于调用

sort(vect.begin(), vect.end(), less<int>() );

sort 中的其他比较函数


equal_to


相等


not_equal_to


不相等


less


小于


greater


大于


less_equal


小于等于


greater_equal


大于等于

上述例子中系统自己为sort提供了less仿函数。在STL中还提供了其他仿函数,以下是仿函数列表:

不能直接写入仿函数的名字,而是要写其重载的()函数: less<int>();

当你的容器中元素时一些标准类型(int float char)或者string时,你可以直接使用这些函数模板。但如果你

时自己定义的类型或者你需要按照其他方式排序,你可以有两种方法来达到效果:一种是自己写比较函数。另一种是重载类型的‘<‘操作赋。如:

bool less_second(const myclass & m1, const myclass & m2) {

return m1.second < m2.second;

}

3.      全排序:全排序即把所给定范围所有的元素按照大小关系顺序排列。sort采用的是成熟的"快速排序算法"(目前大部分STL版本已经不是采用简单的快速排序,而是结合内插排序算法)。复杂度为n*log(n).stable_sort采用的是"归并排序",分派足够内存是,其算法复杂度为n*log(n), 否则其复杂度为n*log(n)*log(n),其优点是会保持相等元素之间的相对位置在排序前后保持一致。

用于全排序的函数有:

void sort(RandomAccessIterator first, RandomAccessIterator last);

void sort(RandomAccessIterator first, RandomAccessIterator last,StrictWeakOrdering comp);

void stable_sort(RandomAccessIterator first, RandomAccessIterator last);

void stable_sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp);

4.      局部排序:partial_sort采用的堆排序(heapsort),它在任何情况下的复杂度都是n*log(n).

局部排序其实是为了减少不必要的操作而提供的排序方式。

其函数原型为:

1)      void partial_sort(RandomAccessIterator first, RandomAccessIterator middle,RandomAccessIterator last);

2)      void partial_sort(RandomAccessIterator first,RandomAccessIterator middle,
         RandomAccessIterator last, StrictWeakOrdering comp);

3)      RandomAccessIterator partial_sort_copy(InputIterator first, InputIterator last,
         RandomAccessIterator result_first,RandomAccessIterator result_last);

4)      RandomAccessIterator partial_sort_copy(InputIterator first, InputIterator last,
         RandomAccessIterator result_first,RandomAccessIterator result_last, Compare comp);

用法使用情况:班上有1000个学生,我想知道分数最低的5名是哪些人。

partial_sort(vect.begin(), vect.begin()+5, vect.end(),less<student>());

5.      nth_element 指定元素排序

void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last);

void nth_element(RandomAccessIterator first, RandomAccessIterator nth,RandomAccessIterator last,

StrictWeakOrdering comp);

使用情况:班上有1000个学生,我想知道分数排在倒数第4名的学生。

nth_element(vect.begin(), vect.begin()+3, vect.end(),less<student>());

6.          partition 和stable_partition :partition就是把一个区间中的元素按照某个条件分成两类,并没有排序。

其函数原型为:

ForwardIterator partition(ForwardIterator first, ForwardIterator last, Predicate pred)

ForwardIterator stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred);

用法如:班上10个学生,计算所有没有及格(低于60分)的学生:

student exam("pass", 60);

stable_partition(vect.begin(), vect.end(), bind2nd(less<student>(), exam));

7.      效率由高到低(耗时由小变大):

partion

stable_partition

nth_element

partial_sort

sort

stable_sort

8.      Effective 1)      若需对vector, string, deque, 或 array容器进行全排序,你可选择sort或stable_sort;

若只需对vector, string, deque, 或 array容器中取得top n的元素,部分排序partial_sort是首选.

若对于vector, string, deque, 或array容器,你需要找到第n个位置的元素或者你需要得到top n且不关系top

2)      n中的内部顺序,nth_element是最理想的;

3)      若你需要从标准序列容器或者array中把满足某个条件或者不满足某个条件的元素分开,你最好使用partition或stable_partition;

4)      若使用的list容器,你可以直接使用partition和stable_partition算法,你可以使用list::sort代替sort和stable_sort排序。若你需要得到partial_sort或nth_element的排序效果,你必须间接使用。

STL中排序函数详解

时间: 2024-10-06 22:49:36

STL中排序函数详解的相关文章

STL之set详解(二)

首先来看看set集合容器: set集合容器实现了红黑树的平衡二叉树数据结构,在插入元素时它会自动调整二叉树的排列,把该元素放到适当的位置,并且 保证左右子树平衡.平衡二叉检索树采用中序遍历算法. 对于set,vector,map等等,它们的前向迭代器定义是这样的(以set为例): set<int>::iterator it; for(it=s.begin();it!=s.end();it++){} 那么反向迭代器呢? set<int>::reverse_iterator rit;

[GeekBand] STL 仿函数入门详解

本文参考文献::GeekBand课堂内容,授课老师:张文杰 :C++ Primer 11 中文版(第五版) page 37 :网络资料: 叶卡同学的部落格  http://www.leavesite.com/ 前言:本文主要通过关联容器set解释下仿函数的实现及工作原理. 一.STL六大组件简介 1.Containers(容器):各种数据结构,如Vector,List,Deque,Set,Map,用来存放数据2.Algorithms(算法):如. Sort,Search.3.Iterators(

【转】【STL】vector详解

转自:http://blog.sina.com.cn/s/blog_9f1c0931010180cy.html Vectors   vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据.为了可以使用vector,必须在你的头文件中包含下面的代码:#include <vector> 构造函数.

STL——嗯~算详解(⊙_⊙)?

STL 在广义上主要分为三类:1. algorithm(算法):完成特定的功能2. container(容器):用于存储数据3. iterator(迭代器): 类似于指针,用于访问容器中的内容 STL - Algorithm(算法) STL 中大部分的算法都在 <algorithm> 库中,用的时候只需要在头文件中包含进来即可 #include <algorithm> * 接下来介绍几个在程序中常使用的算法: STL - Algorithm(算法) - min, max(取最值)

C++ STL之vector详解

Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据.为了可以使用vector,必须在你的头文件中包含下面的代码:#include <vector> 构造函数. Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在

C++ STL之deque详解

deque容器 deque容器是C++ STL中的内容.deque与vector类似,支持随机访问和快速插入删除.deque还支持从开始端加入数据:push_front() 构造函数 deque<Elem> d;//创建一个空的deque deque<Elem> d1(d2);//复制一个deque ~deque<Elem>();//销毁所有数据,释放内存 成员函数 deque.begin();//返回指向第一个元素的迭代器 deque.end();//返回指向最后一个

[C++ STL] set使用详解

一.set介绍: set容器内的元素会被自动排序,set与map不同,set中的元素即是键值又是实值,set不允许两个元素有相同的键值.不能通过set的迭代器去修改set元素,原因是修改元素会破坏set组织.当对容器中的元素进行插入或者删除时,操作之前的所有迭代器在操作之后依然有效. 二.用法 1.头文件 #include <set> //set属于std命名域的,因此需要通过命名限定,例如using std::set; 2.定义及初始化 set<int> a; //定义一个int

STL algorithm算法详解

选一些感觉实用的写一下 count()    返回等价于给定值的元素个数 count_if()    返回满足条件的冤死个数 find() find_if() find_if_not() for_each() min_element(Iterator begin , Iterator end)min_element(Iterator begin , Iterator end , compFunc op)max_element(Iterator begin , Iterator end)max_e

STL之vector详解

一.vector容器的自增长 首先,我们知道vector容器是由数组做出来的:它具备了数组的优缺点. 数组的优点: 操作数据,读取速度很快,因为有下标: 数组的缺点: 分配之后不能在改变大小: 1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 int main() 7 { 8 int bb[3]; 9 bb[0] = 1; 10 bb[1] = 2; 11 bb[2] = 3; 12 13