Nginx配置 Mxnet unity ldap mono swagger Backbonejs Vanilla JS formvalidator.js progressjs 后台页面模板 pmp视频 大数据驾驶舱 js获取月份 js基本数据类型有哪些 docker导入镜像 pythonsocket编程 数据库查询 二分查找python python日期转时间戳 python正则匹配 搭建java环境 java中数据类型 java获取当前年月 java方法调用 linux教程 linux命令详解词典 手机主题之家 脚本 手机知识 js关闭当前页面 java字符串截取 程序卸载 js获取子元素 极限防守图 驱动精灵绿色版 沉沦之城 正则表达式替换 hedit excel后缀
当前位置: 首页 > 学习教程  > 编程语言

stl的比较器的规定

2020/10/8 18:33:56 文章标签:

今天写一个测试代,码,片段如下: #include <vector> #include <algorithm> using namespace std;class Person { public:unsigned int age 0;bool used false; };inline bool operator<(const Person& A,const Person& B) {if (!A.used)return true;r…

今天写一个测试代,码,片段如下:

#include <vector>
#include <algorithm>
using namespace std;

class Person
{
public:
	unsigned int age = 0;
	bool used = false;
};

inline bool operator<(const Person& A,const Person& B)
{
	if (!A.used)
		return true;
	return false;
}

int main()
{
	vector<Person> persons = vector <Person>(2);
	sort(persons.begin(), persons.end());
	
	return 0;
}

在VS2019里运行会报错,经过晨星的指点,原因是我定义的<不符合stl里strict weak order的要求.

stl实现自定义的<函数时,要求有如下几个数学性质

1.反自反性,对任何元素x,都必须满足 表达式x<x的结果为false  (反自反性)

2、对两个不同元素x和y,  x<y和y<x最多只有一个成立  

3、对任意两个元素x和y,如果!(x<y)和!(y<x)同时成立的话,则意味着x==y.(反对称性)

.貌似vs2019里的stl会根据上面三条检查运行结果,所以会出错.

解决办法:把<的规则改成

inline bool operator<(const Person& A,const Person& B)
{
	if (A.used != B.used)
		return !A.used;
	else if (A.used && B.used)
		return A.age < B.age;
	else
		return false;
}

即可.

最后测试了一下极端情况,在<里只写return false,可以运行成功,写return true的话,则运行报错.

个人理解,对序列里的元素都相等的情况,则对任何x和后面的y,x<y都不成立,但是x>=y成立.

所以return false不违反数学规定,return true则意味着认为前面的都小于后面的,这就会导致x<y和y<x同时发生.所以会出错


本文链接: http://www.dtmao.cc/news_show_250061.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?