22. 切勿直接修改set或multiset中的键
像所有的标准关联容器一样,set和multiset按照一定的顺序来存放自己的元素,而这些容器的正确行为也是建立在其原始保存有序的基础之上的。如果把关联容器中的一个元素的值改变了,那么,新的值可能不在正确的位置上,这将会打破容器的有序性。
直接修改map、multimap的值,不能通过编译,因为他们的元素类型实际为std::pair<const K, V>,因为键的类型是const K,所以不能修改。
直接修改map、multimap的键行不通,但是修改set、multiset的键却是可行的。其元素类型为T而非const T。
有一个雇员类;
class Employee
{public:...const std::string& name() const;void SetName(const std::string& name);const std::string& title() const;void SetTitle(const std::string& title);int idNumber() const;...
}
创建一个使用id进行排序的set:
auto sortFunc = [](const Employee& lhs, const Employee& rhs) {return lhs.idNumber() < rhs.idNumber(); };
std::set<Emplyee, sortFunc> datas;
datas以Employee的id进行排序,只要不修改id,datas的排序就不会改变,所以set、multiset的键为T而不是const T。
因为set或multiset中的值不是const,所以,对这些值进行修改的代码可以通过编译。如果你修改set或multiset中的元素,请记住,一定不要改变键部分-元素的这部分信息会影响容器的排序性。如果改变了这部分内容,那么你可能会破坏该容器,再使用该容器将导致不确定的结果,而错误的责任在于你。
如果想以一种总是可行而且安全的方式来修改set、muliset、map、multimap中的元素,则可以分5个简单步骤来进行:
- 找到你想修改该的容器的元素。
- 为将要被修改的元素做一份拷贝。
- 修改该拷贝,使它具有你期望它在容器中的值。
- 把该元素从容器中删除,通常是通过调用erase来进行的。
- 把新的元素从容器中删除,如果按照容器的排列顺序,新元素的位置可能与被删除元素的位置相同或紧邻,则使用“提示hint”形式的insert,以便把插入的效率从对数时间提高到常数时间。
例如,将datas中键为“WorldPeace”的元素修改为“HelloWorld”:
auto iter = datas.find("WorldPeace");
if (iter != datas.end())
{auto curData = *iter;curData.setName("HelloWorld");datas.erase(iter);datas.insert(curDatas);
}
22. 切勿直接修改set或multiset中的键相关推荐
- 一周新闻纵览:网信办:切勿购买修改朋友圈定位服务;网信办三季度约谈网站747家;过度索取住客信息,华住旗下酒店涉嫌侵犯隐私
1 网信办: 切勿购买修改朋友圈定位服务 针对央视新闻频道披露的闲鱼.转转等网络二手平台存在出售微信朋友圈定位修改服务的乱象,昨天,国家网信办举报中心提醒广大网民,切勿购买修改朋友圈定位服务,更不要轻 ...
- 人力资源学python有意义吗-python爬虫抖音 个人资料 仅供学习参考 切勿用于商业...
本文仅供学习参考 切勿用于商业 本次爬取使用fiddler+模拟器(下载抖音APP)+pycharm 1. 下载最新版本的fiddler(自行百度下载),以及相关配置 1.1.依次点击,菜单栏-Too ...
- linux权限750什么意思,chmod 777是什么意思?为您解释chmod 777及切勿使用chmod 777的原因...
如果您不清楚chmod 777是什么意思?那本文将为您解释chmod 777及切勿使用chmod 777的原因,包括应对之策.如果您正在尝试修复Web服务器的权限问题,并在Internet上找到了信息 ...
- 假冒网站引发多重安全风险 | 官方严正声明:切勿在非官方渠道购买或下载 Navicat 软件
Navicat 严正声明 近期,有关于 Navicat 假冒网站的事件,不法分子通过仿制官方网站,诱导用户下载盗版软件.Navicat 官方已正式向国内监管部门举报,提请将该不法网站下架.目前,监管部 ...
- Python3,os模块还可以这样玩,自动删除磁盘文件,非必要切勿操作。
删除磁盘下所有的文件 1.引言 2.代码实战 2.1 模块介绍 2.2 获取盘符 2.3 获取盘符下的目录 2.3.1 os.listdir() 2.3.2 os.environ 2.3.3 os.g ...
- iOS7.X越狱工具evasi0n7存重大bug 切勿急于越狱
本文网址 http://shouji163.cn/2421.html 12月22日晚,evad3rs越狱梦之队悄无声息的发布了 iOS7完美越狱工具evasi0n7,该工具对外号称是支持全系iOS设备 ...
- PostgreSQL 切勿kill -9去杀进程
熟悉Oracle的人可能会去经常使用kill -9杀进程,因为有的时候使用SQL命令去杀进程,一些进程的状态只是会被置为"killed"状态,其锁定的资源仍然没有释放,可能会收到提 ...
- AI一分钟|倪光南:“中国芯”切勿重硬轻软;阿里达摩院入职95后最年轻科学家,参与无人车研发...
▌倪光南:"中国芯"切勿重硬轻软 中国工程院院士.计算机专家倪光南在接受媒体采访时表示,"过去汽车电子领域被外国跨国公司所垄断,它们的芯片有强大的生态支持,使中国芯片难以 ...
- c++ file* 句柄泄漏_C++核心准则?讨论:持有没有被句柄管理的资源时切勿抛出异常...
Discussion: Never throw while holding a resource not owned by a handle 讨论:持有没有被句柄管理的资源时切勿抛出异常 Reason ...
- 一群参与境内外赌博网站的开发的程序员被抓,网友:切勿面向监狱编程...
近期,广州警方侦破一宗为赌博团伙提供黑灰产业链支撑帮助信息网络犯罪活动专案,抓获嫌疑人91名.据悉,该案是广州市近年来打击跨境网络赌博生态犯罪中,涉及黑灰产环节最多.地域跨度最广.链条最完整的案件. ...
最新文章
- 单片机教学视频讲得好
- sql2008表结构查看_【赵强老师】Oracle数据库的存储结构
- 自然辩证法的当代价值
- Linux 命令 —— scp linux之间复制文件和目录
- Java线程同步:synchronized锁住的是代码还是对象
- android实现箭头流程列表_反思|Android 列表分页组件Paging的设计与实现:系统概述...
- client 连接 host —— 虚拟机
- 小学奥数 7657 连乘积末尾0的个数 python
- Unity动画系统详解10:子状态机是什么?
- python学习知识以及就业方向_Python需要学到什么技术 学完可以从事哪些行业
- 求数组第二大元素 和 字符串拷贝的实现
- 关于递归转换成循环的思想
- c语言 mysql 查询数字_使用mysql C语言API编写程序—MYSQL数据库查询操作
- 结合nginx源码学习error_page和proxy 指令的关系
- 视频如何转换html链接地址,视频肿么生成html代码放到自己的网页去求解答法案...
- 条形码类型及常见条形码
- C++: decay关键字的作用
- gitlab 不能启动 runsv not running
- 《BiLSTM with Multi-Polarity Orthogonal Attention for Implicit Sentiment Analysis》论文阅读笔记
- 信用卡还款怎么分期,还款还是要技巧的
热门文章
- 移动端学习笔记(小强测试品牌学员作品)
- Python编写API接口
- Zookeeper实现简单的分布式RPC框架
- Python使用TCPServer编写(多线程)Socket服务
- 转载:ofstream和ifstream详细用法
- 今天看C++Primer发现的问题
- Apple的Mac OS X帮助BSD开发赶超Linux
- 1.从Paxos到Zookeeper分布式一致性原理与实践---分布式架构
- C# 新特性 操作符单?与??和 ?. 的使用
- Es6语法实现的转盘抽奖效果——可配置转盘的抽奖概率