Widget类定义如下:

class Widget
{
public:...size_t weight() const;size_t maSpeed() const;...
}

通常情况下,按重量对Widget进行排序是最自然的方式。Widget的operator < 反映了这一点。

bool operator < (const Widget& lhs, const Widget& rhs)
{return lhs.weight() < rhs.weight();
}

但是在某种情况下,我们需要创建一个按照最大速度进行排序的multiset容器。mutliset的默认比较函数是less,而less在默认情况下会调用operator <来完成自己的工作。

为了让multiset按照最大速度进行排序,一种显而易见的实现方式是:特化less,切断less和operator < 之间的关系,让它只考虑Widget的最大速度:

template<>
struct std::less<Widget> : public std::binary_function<Widget, Widget, bool>
{bool operator () (const Widget& lhs, const Widget& rhs) const {return lhs.maxSpeed() < rhs.maxSpeed();}
}

operator < 不仅仅是less的默认实现方式,它也是程序员期望less所做的事情,让less不调用operator < 而去做别的事情,这会无端违背程序员的意愿,这与"最小给人惊奇"原则完全背道而驰,应该完全避免。

在STL中,凡是使用了less的地方你都可以指定另外的一个比较类型。然后让它来完成你期望的比较操作:

struct  MaxSpeedCompare : public binary_function<Widget, Widget, bool>
{bool operator () (const Widget& lhs, const Widget& rhs) const {return lhs.maxSpeed() < rhs.maxSpeed();}
}

为了创建新的multiset,使用MaxSpeedCompare作为比较类型,这样就避免使用了默认的比较类型(less):
multiset datas;它创建了一个存放Widget的multiset容器,排序规则由MaxSpeedCompare定义。

相比之下,mutliset datas;说明了datas是一个采用默认排序方式的、存放Widget对象的mutliset容器。这意味着它使用less进行排序,但事实上所有人都会假设它是通过operator <来排序的。

应该尽量避免修改less的行为,因为这样做很可能会误导其他人。如果你使用了less,无论是显示还是隐式,都需要确保它与operator <具有相同的意义。如果你希望以一种特殊的方式来排序对象,那么最好创建一个特殊的函数子类,它的名字不能是less。

15.确保“lessT“与“operator小于“具有相同的语义相关推荐

  1. [6 函数子类及函数] 42. 确保less<T>与operator<具有相同的语义(POLA)

    假设Widget包含一个重量值和一个最大速度值: class Widget { public:...size_t weight() const;size_t maxSpeed() const;... ...

  2. 1.15.Flink state(状态)管理与恢复、什么是state、Keyed State、Operator State、状态容错(生成快照,恢复快照),checkPoint简介,重启策略等

    1.15.Flink state(状态)管理与恢复 1.15.1.什么是state 1.15.2.状态(State) 1.15.3.Keyed State 1.15.4.Operator State ...

  3. 全程15分钟 详解如何为MacBook Pro 15寸 加装固态硬

    本文导航 第1页:详解如何为MBP15加装固态硬 第2页:用时约3分钟:查看硬盘和光驱接口信息 第3页:用时约2分钟:拆解机身底盖螺丝 第4页:用时约3分钟:拆解光驱和清理风扇 第5页:用时约5分钟: ...

  4. C++ operator操作符重载(++,--,-,+,())

    C++中++,--操作符重载需要说明是++(--)在操作数前面,还是在操作数后面,区别如下: 代码经过测试无误(起码我这里没问题^_^) Code  1#include <iostream> ...

  5. 多模态数据也能进行MAE?伯克利谷歌提出M3AE,在图像和文本数据上进行MAE!最优掩蔽率可达75%,显著高于BERT的15%...

    关注公众号,发现CV技术之美 本文分享论文『Multimodal Masked Autoencoders Learn Transferable Representations』,思考:多模态数据也能进 ...

  6. Effective STL 50条有效使用STL的经验笔记

    Scott Meyers大师Effective三部曲:Effective C++.More Effective C++.Effective STL,这三本书出版已很多年,后来又出版了Effective ...

  7. 一周一论文(翻译)——[SIGMOD 19] Elasticutor:Rapid Elasticity for Realtime Stateful Stream Processing

    Abstract 弹性非常适用于流系统,以保证针对工作负载动态的低延迟,例如到达率的激增和数据分布的波动.现有系统使用以resource-centric的方法实现弹性,该方法在并行实例(即执行程序)之 ...

  8. 《C++ Primer 5th》笔记(3 / 19):字符串、向量、迭代器和数组

    文章目录 命名空间的using声明 标准库类型string 定义和初始化string对象 直接初始化和拷贝初始化 string对象上的操作 读写string对象 读取未知数量的string对象 使用g ...

  9. 烽火2640路由器命令行手册-04-网络协议配置命令

    网络协议配置命令 目  录 第1章 IP寻址配置命令... 1 1.1 IP寻址配置命令... 1 1.1.1 arp. 1 1.1.2 arp timeout 2 1.1.3 clear arp-c ...

最新文章

  1. java spring注解教程,spring注解
  2. 助力5G行业应用扬帆启航,第二届5G毫米波产业高峰论坛圆满召开
  3. 开发日记-20190510
  4. 滚动到底部或顶部响应的ScrollView使用
  5. OSPF邻接形成过程
  6. ABAP 判断某个或者某段字符串是否为汉字
  7. 每个人都在谈论硒替代品-明智地选择!
  8. (转)JDK 1.5中的ENUM用法
  9. w7 mysql不启动_Win7安装mysql5.7服务无法启动没有任何报错信息处理:
  10. 今日恐慌与贪婪指数为65 等级转为贪婪
  11. JadClipse反编译工具在MyEclipse中的安装(先看Eclipse的配置方式)
  12. django外键和多数据库应用
  13. 绘图的尺寸_【科研绘图1】你离顶级期刊封面仅差一步
  14. EVE-NG硬盘扩容,存储海量镜像
  15. Xamarin.Forms 解决ListView高度问题
  16. 无基础如何备考软考软件设计师?
  17. 将yolov4的权重文件转换为wts文件
  18. 大话西游手游服务器合服信息查询,大话西游手游2021年6月合区查询 6月最新合区列表...
  19. 2021-02-05
  20. HTML5基本结构及标签

热门文章

  1. 完成了C++作业,本博客现在开始全面记录acm学习历程,真正的acm之路,现在开始
  2. 查看wcf服务中方法测试客户端
  3. 存储过程IN参数疑难问题解决方法【真正解决】
  4. [转] Lock-Free 数据结构
  5. [网络安全自学篇] 四十五.病毒详解及批处理病毒原理分析(自启动、修改密码、定时关机、蓝屏、进程关闭)
  6. [LeetCode] Isomorphic Strings - 字符串操作:数组计数字符个数问题
  7. Python之深入解析优秀的时间格式转换工具Delorean
  8. 2019/Province_C_C++_A/B/数列求值
  9. scp: /usr/java: Permission denied
  10. 《数据库原理与应用》(第三版) 第 6 章 数据操作语句 基础 习题参考答案