c++语言定义排序函数,关于C++中定义比较函数的三种方法小结
C++编程优与Pascal的原因之一是C++中存在STL(标准模板库)。STL存在很多有用的方法。
C++模板库中的许多方法都需要相关参数有序,例如Sort()。显然,如果你想对一个集合进行排序,你必须要知道集合中的对象,那个在前那个在后。因此,学会如何定义比较方法是非常重要的。
C++模板库的许多容器需要相关类型有序,例如set 和priority_queue。
这篇文章旨在告诉大家如何为一个类定义一个排序方法,以便在STL容器或者方法中使用。 作为一个C++程序员,你应该知道这些方法。
如何定义排序?
简而言之,为一个类定义排序,我们就可以知道类的任意两个对象在排序的过程中谁在前谁在后。我们可以用一个方法来实现,这个方法返回一个bool值表示谁排在前面。显然,我们希望实现一个类似,f(x,y),这种形式的方法。它接收同一类型的对象作为两个参数,返回值则表明谁会出现在谁前面。
严格弱序化
几乎所有的方法或容器都需要排序来满足数学意义上的标准严格弱序化,否则这些方法或容器的行为将不可预知。
假设f(x,y)是一个比较函数。 如果该函数满足如下条件则它是严格弱序化的。
1.f(x,x) = false;
2. if f(x,y) then !f(y,x)
3.if f(x,y) and f(y,z) then f(x,z)
4. if !f(x,y)&&!f(y,x) then x==y; if x==y and y==z then x==z;
看上去有点晕乎,不过不用担心,只要你的比较方法能够满足对相等元素永远返回false,那你的方法就满足要求了。
三种实现方式:
1. 定义 < 操作符。
使用这种方法可以使我们自定义的类能够获得与生俱来的排序能力。例如,如果有如下类:
struct Edge
{
int from,to ,weight;
};
因为要实现Kruskai算法,你希望图中的所有边依据权重按降序排列。 像这样来定义 operator
struct Edge
{
int from,to ,weight;
bool operator
{
return weight>other.weight;
}
};
你定义的方法必须按照如下方法声明:
bool operator< (T other) const
注意: const关键字是必须的。
如果你不喜欢这种方式,比如,明明是要比较两个对象,方法却只有一个参数。你可以选择如下方式:
struct Edge
{
int from,to weight;
friend bool operator
{
return a.weight>b.weight;
}
};
STL的pair就具有与生俱来的排序能力。两个pair对象的比较这样的:先比较第一个参数,如果第一个参数相同再比较第二个参数。
所有内置类型都具有与生俱来的排序能力,这是由编译器赋予的。
2. 自定义排序方法。
使用这种方式常常用在如下情形:
a.比较内置类型
b.不能修改需要比较的类型
c.除了类型自定义的比较方式以外的比较方法
简单来说,一个比较方法接收两个同类型的对象作为参数并且返回一个bool值,原型如下:
bool name(T a,T b);
3. 重载()操作符
我们可以将比较函数作为STL容器构造函数的第一个参数,并且把函数类型作为模板参数。例如:
set s(cmp);
这样做或多或少会让人费解。那我们就来看看如何使用仿函数来消除你的疑惑吧。
我们需要定义一个新的类并重载()操作符。
vector occurrences;
struct cmp
{
bool operator()(int a, int b)
{
return occurrences[a] < occurrences[b];
}
};
现在我们就可以把这个类作为模板参数传递给STL容器了。
set s;
priority_queue, cmp> pq;
STL也有一些内置的仿函数,例如less,greater等。
仿函数可以通过初始化然后像普通函数一样使用。最简单的就是在仿函数后面加上()。
sort(data.begin(), data.end(), greater());
以上就是小编为大家带来的关于C++中定义比较函数的三种方法小结全部内容了,希望大家多多支持脚本之家~
c++语言定义排序函数,关于C++中定义比较函数的三种方法小结相关推荐
- C语言中比较大小的函数模板,关于C++中定义比较函数的三种方法
关于C++中定义比较函数的三种方法 C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之.以下,小编为大家介绍关于C++中定义比较函数的三种方法,供 ...
- mysql添加临时索引_mysql 中添加索引的三种方法
在mysql中有多种索引,有普通索引,全文索引,唯一索引,多列索引,小伙伴们可以通过不同的应用场景来进行索引的新建,在此列出三种新建索引的方法 mysql 中添加索引的三种方法 1.1 新建表中添加索 ...
- LaTeX 中处理参考文献的三种方法总结
LaTeX 中处理参考文献的三种方法总结 方法一:用BibLaTeX处理 分成如下四步: 第一步:制作生成bib文件: 第二步:在导言区需要加入biblatex宏包: \usepackage[格式控制 ...
- LaTeX中处理参考文献的三种方法总结
LaTeX 中处理参考文献的三种方法总结 1.摘要 2.关键词 3.处理参考文献常用的三种方法 3.1 方法一:用BibLaTeX处理 3.2 方法二:用BibTeX处理 3.3 方法三:用thebi ...
- mysql 中添加索引的三种方法
在mysql中有多种索引,有普通索引,全文索引,唯一索引,多列索引,小伙伴们可以通过不同的应用场景来进行索引的新建,在此列出三种新建索引的方法 mysql 中添加索引的三种方法 1.1 新建表中添加索 ...
- python取整的几种方法,Python中取整的几种方法小结
Python中取整的几种方法小结 前言 对每位程序员来说,在编程过程中数据处理是不可避免的,很多时候都需要根据需求把获取到的数据进行处理,取整则是最基本的数据处理.取整的方式则包括向下取整.四舍五入. ...
- python字典取值_python 字典中取值的两种方法小结
python 字典中取值的两种方法小结 如下所示: a={'name':'tony','sex':'male'} 获得name的值的方式有两种 print a['name'],type(a['name ...
- excel添加列下拉框票价_在Excel中制作下拉列表的三种方法
下拉列表在Excel中的用途十分广泛.在Excel中制作下拉列表可以通过数据有效性.使用窗体控件和VBA控件工具箱中的组合框来制作.下面用一个具体的例子来进行说明(在文章结尾处可下载xls格式的示例文 ...
- 在JavaScript中重复字符串的三种方法
In this article, I'll explain how to solve freeCodeCamp's "Repeat a string repeat a string" ...
最新文章
- (十二)企业级java springcloud b2bc商城系统开源源码二次开发-断路器监控(Hystrix Dashboard)...
- Sci-Hub重生了,这回用上了分布式网络
- c++primer 第五版 p205 22题详细解释
- Spring5的数据访问与集成
- voip 音频采集时间_蓝牙音频续航监测系统展会现场演示
- spring中怎么让事物提交_Spring怎么在一个事务中开启另一个事务
- java解析yml文件_如何基于JAVA读取yml配置文件指定key内容
- Android 剪切板
- 2、AbstractApplicationContext的refresh功能概述
- oracle数据库数据表误删后,恢复数据处理方式
- 用例驱动的需求过程实践
- 空间变量php,PHP名称空间可以包含变量吗?
- (深度原创)华为基于LTC主流程的组织销售能力提升,含相关工具模板方法!
- MX160煲机音乐的选择
- 英雄联盟数据分析专题(一)
- Mysql绿色版本安装
- 2021.04.07 126邮箱自动登陆
- GitLab合并出现 “Ready to be merged automatically” 提示
- 正整数m的百位数字python_求正整数m的百位数字
- 关于unity3D shader的UV理解
热门文章
- 工信部:短信可为 16 亿用户提供行程证明;OPPO 回应造芯计划;Windows Terminal 0.9 发布| 极客头条...
- SQL 已死,NoSQL 才是王道?|原力计划
- 程序员VS产品经理日常
- 如何让你的 Git 历史保持“干净”?!
- 4 大妙招,教你快速搞定复杂的系统编程!
- 程序员如何解决并发冲突的难题?
- Java 和 Python 疯狂 PK,等等,请不要放弃 C 语言
- “杀死” APP 的留白设计!
- 老代码多=过度耦合=if else?阿里巴巴工程师这样捋直老代码 | 技术头条
- 游戏版号重新发放,开发者可以松口气了!| 畅言