STL容器的排序
STL容器的排序,支持随机访问的容器vector,deque,string没有sort成员,可调用std::sort排序;list排序调用自带的list::sort。
下面是std::sort函数,有两个版本:
- template <class RandomAccessIterator>
- void sort ( RandomAccessIterator first, RandomAccessIterator last );
- template <class RandomAccessIterator, class Compare>
- void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
sort函数有以下特征:
1. 要求输入一个范围[first, last)
2. 随机迭代器,能用此算法的容器是支持随机访问的容器:vector, deque, string。
3.第一个版本使用operator<进行比较,默认升序排序,第二个版本使用comp做比较.
关于参数comp,comp带两个同类型的参数,如果第一个参数排在第二个参数前面,返回true,否则返回false
它可以是函数指针,也可以是函数对象。函数指针好理解,何谓函数对象?
函数对象(Function Object),是重载了operator()函数的类(或结构体)实例化出来的对象,使用起来像函数,又叫仿函数。
STL本身提供了几个比较函数,下面这些都是仿函数:
less(小于)
greater(大于)
equal_to(等于)
not_equal_to(不相等)
less_equal(小于等于)
greater_equal(大于等于)
当容器元素为内建类型时可以使用,注意使用的格式,要加模版参数(由于是模板类)和后面的(),如下:
- sort(vec.begin(), vec.end(), less<int>());
对于复合类型,实现排序方式有3种方法:
1) 重载operator<操作符
2) 写全局的比较函数
3) 写仿函数,重载operator()形式为:bool operator()(const 类名& 参数){…}
下面看看这3种方法的实现:
- // 排序元素,比较的对象
- 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& rt)
- {
- return this->id_ < rt.id_;
- }
- // 排序函数写法,默认调用operator<
- sort(members.begin(), members.end());
- // 方式2:写比较函数
- bool CompAge(const Person& pl, const Person& pr)
- {
- return pl.age_ < pr.age_;
- }
- // 排序时传入比较函数指针
- sort(members.begin(), members.end(), CompAge);
- // 方式3:仿函数
- struct CompName
- {
- bool operator()(const Person& pl, const Person& pr)
- {
- return pl.name_ < pr.name_;
- }
- };
- // 排序时传入函数对象
- sort(members.begin(), members.end(), CompName());
用函数对象代替函数指针的优点:
1. 函数对象可以存储中间结果在数据成员中,而函数想要存中间结果须要设全局变量或静态变量,这个是我们不想要的。
2. 在函数对象中编译器可以实现内联调用,从而提升性能。
下面看一个函数对象的扩展应用
- // 利用函数对象实现升降排序
- struct CompNameEx{
- CompNameEx(bool asce) : asce_(asce)
- {}
- bool operator()(const Person& pl, const Person& pr)
- {
- return asce_ ? pl.name_ < pr.name_ : pr.name_ < pl.name_;<span style="white-space:pre"> </span>// 《Eff STL》条款21: 永远让比较函数对相等的值返回false
- }
- private:
- bool asce_;
- };
- // 使用仿函数排序(升降序)
- sort(members.begin(), members.end(), CompNameEx(false));
注意:如果是指针的容器,比较函数的参数也应是指针。
STL容器的排序的更多相关文章
- 【转】c++中Vector等STL容器的自定义排序
如果要自己定义STL容器的元素类最好满足STL容器对元素的要求 必须要求: 1.Copy构造函数 2.赋值=操作符 3.能够销毁对象的析构函数 另外: 1. ...
- STL容器——对map排序
STL容器(三)——对map排序 对于map的排序问题,主要分为两部分:根据key排序:根据value排序.下面我们就分别说一下~ 1. 根据key进行排序 map默认按照key进行升序排序 ,和输入 ...
- STL容器
啦啦啦,今天听啦高年级学长讲的STL容器啦,发现有好多东西还是有必要记载的,毕竟学长是身经百战的,他在参加各种比赛的时候积累的经验可不是一天两天就能学来的,那个可是炒鸡有价值的啊,啊啊啊啊啊 #inc ...
- c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例
c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...
- STL容器的适用情况
转自http://hsw625728.blog.163.com/blog/static/3957072820091116114655254/ ly; mso-default-props:yes; m ...
- STL vector+sort排序和multiset/multimap排序比较
由 www.169it.com 搜集整理 在C++的STL库中,要实现排序可以通过将所有元素保存到vector中,然后通过sort算法来排序,也可以通过multimap实现在插入元素的时候进行排序.在 ...
- 对vector等STL标准容器的排序操作
[+] STL提供的Sort 算法 所有sort算法介绍 sort 中的比较函数 sort 的稳定性 全排序 局部排序 nth_element 指定元素排序 partition 和stable_par ...
- STL容器与配接器
STL容器包括顺序容器.关联容器.无序关联容器 STL配接器包括容器配接器.函数配接器 顺序容器: vector 行为类似于数组,但可以根据要求 ...
- STL容器的本质
http://blog.sina.com.cn/s/blog_4d3a41f40100eof0.html 最近在学习unordered_map里面的散列函数和相等函数怎么写.学习过程中看到了一个好帖子 ...
随机推荐
- Android之应用程序怎样调用支付宝接口
http://blog.csdn.net/lilidejing/article/details/19483717 近期在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口.由于用的人比 ...
- MySQL-修改数据(REPLACE)
MySQL-REPLACE语句 功能介绍:用于向数据库表插入或更新数据. REPLACE语句的工作原理: 如果给定行数据不存在,那么MySQL REPLACE语句会插入新行. 如果给定行数据存在,则R ...
- jquery跨域请求json数据
//服务端生成json数据json.php <?php $json=array("Volvo","BMW","SAAB"); $cb ...
- UVA1523-Helicopter(暴力+全排列)
题目链接 题意:有八个乘客坐在直升机上,求重心M最小值. 思路:依据题目所给的公式,我们能够知道要使得M最小.也就是要使得Mv和Mh的和最小,我们能够使用全排列,分别将每一个值放在各个位子上,然后更新 ...
- Codeforces 690 C3. Brain Network (hard) LCA
C3. Brain Network (hard) Breaking news from zombie neurology! It turns out that – contrary to prev ...
- ffmpeg resize and scale
ffmpeg缩小视频尺寸 | 楚盟博客 https://www.5yun.org/13126.html ffmpeg -i test.mp4 -s 480×360 out.mp4 常用分辨率: 108 ...
- Struts数据验证
Action类继承了ActionSupport类,而该类实现了Action.Validateable.ValidationAware.TextProvider.LocaleProvider和Seria ...
- Android系统定制----删除系统锁屏功能【转】
本文转载自:http://blog.csdn.net/morixinguan/article/details/56675914 frameworks/base/packages/SettingsPro ...
- 策略设计测试用例实践(2)--Pairwise(转)
一.关于”好的“测试用例 在设计测试用例的时候有多种设计方法和策略可以使用,使得测试用例设计得更丰富,尽可能覆盖到更多的程序路径和功能场景.常见的测试用例设计方法被提到最多的就是等价类划分.边界值分析 ...
- Geometry Shader 实现 Wireframe 绘制边线的Shader
最终效果: 参考了一个免费插件 https://assetstore.unity.com/packages/vfx/shaders/directx-11/ucla-wireframe-shader-2 ...