zoukankan      html  css  js  c++  java
  • 条目二十二《切勿修改set或multiset的键》

    ###条目二十二《切勿修改set或multiset的键》

    所有的标准关联容器一样,set和multiset按照一定的顺序来存放自己的元素,而这些容器的正确行为也是建立在其元素保持有序的基础之上的。如果你把关联容器中一个元素的值改变,那么元素在容器的位置就被破坏。

    对于map和multimap来说,这应该是比较容易在编码期就能发现问题的。因为它们的模板类型是pair<K, V>,K是const,所以如果修改K就会在编译时报错。

    对于set或multiset来说,在编码期可能发现不了问题,因为它们的模板类型是K,而且K是非const的,所以能够被修改。

    但是按照开头的关联容器的键不能修改结论,如果修改了set或multiset的,容器就会被破坏。

    注意了,这里的指的是真正作为键的值不能被修改,其实如果键是一个结构体里的一个成员,那么除了这个成员不能被修改,其他被修改是没问题的。这也是不能把set或multiset的键设为const的原因。

    然而,不同stl厂商对set和multiset的键是否可被修改,也就K返回是否是const作不同的处理,所以为了可移植性,应该统一,别修改set和multiset的

    除了使用对迭代器去const再取地址的方法 来修改健值: 'const_cast< Employee&> * itr->setValue()'

    一种总是可行而且安全的方式来修改set、multiset、map和multimap中的元素,则可以分5个简单步骤来进行:

    • 1.找到要修改的元素
    • 2.复制一份待修改的元素的副本
    • 3.修改副本
    • 4.删除待修改的元素的容器的此元素
    • 5.副本插入到原来的待修改容器中

    #####读 > 改 > 写 三部曲

  • 相关阅读:
    使用FileReader在浏览器读取预览文件(image和txt)
    移动端Vue图片获取,压缩,预览组件-upload-img(H5+获取照片,压缩,预览)
    文件(图片)转base64
    Vue单页面应用打包app处理返回按钮
    hbuilder/hbuilderx 无法检测到模拟器
    不启动AndroidStudio直接启动其模拟器
    ES6,箭头函数 (=>)注意点
    ES6,扩展运算符
    strcmp使用注意
    android11 gc5035前置摄像头当作后置使用左右镜像问题
  • 原文地址:https://www.cnblogs.com/liangjf/p/10275035.html
Copyright © 2011-2022 走看看