内容更新

传送门:C++ STL set容器完全攻略(超级详细)
这个教程里有几句话是这样的:

“通过前面的学习我们知道,map、multimap 容器都会自行根据键的大小对存储的键值对进行排序,set 容器也会如此,只不过 set 容器中各键值对的键 key 和值 value 是相等的,根据 key 排序,也就等价为根据 value 排序。”
“其实,借助 set 类模板定义中第 2 个参数,我们完全可以手动修改 set 容器中的排序规则。”

于是继续查set的用法,查到了一个博客C++中set用法详解 并找到了自己感兴趣的内容

也就是我当时把比较函数写在类里的做法是正确的,但忘了加上个关键词const导致出现了C2678错误。
下面的内容可以不用看了,感兴趣可以去看一下打脸内容(虽然也不完全打脸)

打了几天的代码,如释重负地按了下Ctrl+B去编译,然后弹出一些小问题我都能解决,但出现了个C2676我是怎么都想不到的,追根溯源看到了问题出在了set<***>那一行,但奇怪的是为什么会有C2676报错呢。

去搜C2676报错看不到有用的信息,去搜关键词"C++ set C2676"也搜不出什么有用的东西,可能是我的搜索姿势有问题?于是我就不费时间去搜,打算自己解决。我双击那一错误跳转去xstddef文件,看到个运算符函数定义,我纳闷了,这怎么用…(因为没学习过STL源码方面的知识所以一点都看不懂这些东西)

于是就拍拍脑袋随便想出了个解决方法:既然出现了比较运算,那么我是不是直接在我那结构体/类里设置个运算符重载就好了?单开个测试项目去试试有没有猜对。结果猜对了,但不完全对,错误从C2676变为了C2678

去查了下C2678,和我当前的情况一点都不符,继续分析猜测:反复看xstddef里的那个运算符重载,感觉自己应该是猜对的,是需要为我的Book重载运算符,但重载的地方不对,不应该设置为成员函数。于是把函数拉到外面,结果的确是运行成功了,猜想正确:自定义的结构体需要额外去实现operator<()才能正常使用set。(有可能还有其他解决方法,但我是懒人,一找到解决方法而且难度不大的情况下是不会再去找新的)

上面截图中,往集合sss中插入的数据中Book(5,1)插入失败,它并不在集合sss当中,说明operator<()函数要是返回false的话该数据就插入失败,猜测底层是这么调用的:往sss{A,B,C}中插入新数据M时,会判断A < M和M < A,如果两次都是假说明A==M,M插入失败,A!=M时会判断B和C是不是也与M相等,当sss中所有元素都与M不等时才会把M插入sss中。

也就是set的底层是有序的(有序的目的是为了优化算法,要不然逐个遍历集合中的元素去判断插入的元素是否重复的做法是非常愚蠢的),但表层上是无序的,不能像vector一样使用下标运算符operator[]

想着自己 “来都来了何不试点别的?”,就对operator<的返回值改为false和true,结果很惊喜:


先说结论:
1、集合里插入的第一个元素是不会调用operator<()的,这可以在调试中验证猜想:在集合不为空时每插入一个元素都会去调用operator<()
2、要是operator<()始终返回false,那么新数据怎么都插不进去
3、要是operator<()始终返回true,那么新数据插入过程中会发生错误,这错误是try-catch阻止不了的。try-catch能阻止的是异常,阻止不了错误,程序运行时发生异常时可能还能跑,但发生错误时是一定会被强制结束的。

不管了,问题既然解决了那就继续痛苦撸码。并不打算在不关心的地方继续深究(如set的底层结构之类的)。
开头我说了,我是打了几天的代码才去编译的,言外之意是代码量很大,几百来行的那种。代码的首次运行肯定是意外不断的,debug之路就此开启。

(不是码农,屑大学生而已,还挂科的那种

【C++】关于set的一些奇怪问题:错误C2676 二进制“<”:“const _Ty”不定义该运算符或到预定义运算符可接收的类型的转换相关推荐

  1. android程序出现了奇怪的错误 Field requires API level 5 (current min is 1): ......

    android程序出现了奇怪的错误  Field requires API level 5 (current min is 1): ...... 解决办法: Right click on the pr ...

  2. windows定时任务奇怪的错误

    windows定时任务奇怪的错误 如果你的windows定时任务有以下两种错误 0x2 错误 0x8007010b 目录名称无效 如果你已经试过了网上的很多方法,比如针对上面第一种方法,在定时任务上添 ...

  3. oracle有三种类型的异常错误: 预定义 ( Predefined )错误里面的常见错误

    oracle有三种类型的异常错误: 预定义 ( Predefined )错误, 非预定义 ( Predefined )错误, 用户定义(User_define) 错误 预定义 ( Predefined ...

  4. darknet出现以下错误 /home/ubtu/anaconda3/lib/libQt5Core.so.5:对‘ucnv_toUnicode_58’未定义的引用

    darknet出现以下错误 /home/ubtu/anaconda3/lib/libQt5Core.so.5:对'ucnv_toUnicode_58'未定义的引用 collect2: error: l ...

  5. 错误 C2679 二进制“=”: 没有找到接受“const _Ty”类型的右操作数的运算符(或没有可接受的转换)的一种情况发生的错误

    错误 C2679 二进制"=": 没有找到接受"const _Ty"类型的右操作数的运算符(或没有可接受的转换 记录一下自己写代码出现的错误. 问题 写关于复数 ...

  6. window下 PHP socket 错误码预定义常量, 对应数值,错误信息

    window下 PHP socket 错误码预定义常量, 对应数值,错误信息! php版本: PHP 7.4.0 (cli) (built: Nov 27 2019 10:14:18) ( ZTS V ...

  7. PLSQL——动态SQL、异常(预定义异常、非预定义异常、自定义异常)、引发应用程序错误

    1.动态 SQL 动态 SQL 是指在PL/SQL程序执行时生成的 SQL 语句 编译程序对动态 SQL 不做处理,而是在程序运行时动态构造语句.对语句进行语法分析并执行 DDL 语句命令和会话控制语 ...

  8. 【C++】c++编译错误-- C2678 二进制“=”: 没有找到接受“_Ty”类型的左操作数的运算符(或没有可接受的转换)

    [C++]c++编译错误-- C2678 二进制"=": 没有找到接受"_Ty"类型的左操作数的运算符(或没有可接受的转换) 代码: //by 鸟哥 rever ...

  9. c++编译错误-- C2678 二进制“=”: 没有找到接受“_Ty”类型的左操作数的运算符(或没有可接受的转换)

    代码: //by 鸟哥 reverse引起的编译错误 //有疑问请留言或加群 1032082534 #include<iostream> #include<algorithm> ...

  10. 调用webservice的奇怪404错误

    客户报告了一个奇怪的问题:我们的产品,其他功能都是好的,就是修改用户的功能无效,日志里报:The request failed with HTTP status 404: Not Found. 代码分 ...

最新文章

  1. visual studio code 里调试运行 Python代码
  2. 每天五分钟linux(8)-cp
  3. php打印四边形,用php的for循环输出四边形,各种三角形和菱形【含空心版本】
  4. 性能测试中用LambdaProbe监控Tomcat
  5. 《Android游戏开发详解》一导读
  6. Android之如何解决popupWindow(pw.setFocusable(true))按返回键和menu键退出
  7. 怎样寻回win8因为删除后清空回收站的数据
  8. 实现python扩展的C API方法过程全纪录(windows)
  9. 记一次DNS运维排错
  10. 动态生成WebService的客户端
  11. Axure 9.0 上使用 Font Awesome 图标库
  12. 微信如何html动图文件,微信里的gif动态图片如何导出保存出来?看完本文你就知道了...
  13. excel 组合框控件使用方法
  14. [C#] 软硬结合第二篇——酷我音乐盒的逆天玩法
  15. 分布式服务治理及优化经验
  16. Python第四天——requests实战
  17. 安卓手机卡顿怎么解决_苹果手机卡怎么办 小技巧解决ipone手机卡顿现象
  18. 从0开发游戏引擎之引擎基础组件-Node类实现
  19. 苹果xr十大隐藏功能_苹果iPhone12Pro隐藏功能!简单3步骤“量身高”
  20. 20170908一些随笔感悟

热门文章

  1. IE11主页被篡改解决方法
  2. map拼接URL参数
  3. 2021苹果AppleiOS开发证书申请详细图文流程
  4. 图像压缩编码和解码原理——阐述了DCT变换的实质
  5. 再见,可视化!你好,Pandas!
  6. pandas在df类型后面插入一行
  7. Rendezvous: A Search Engine for Binary Code
  8. 电影下载合并教程 (转)
  9. Spark 的情感分析
  10. 666: 神奇的 SQL 之别样的写法 → 行行比较