简介

元素在std::set中构造后,如果需要查找,则调用find成员函数,但是该方式有一个致命的缺陷,就是返回的是一个常指针,无法通过指针更改元素的值。这样做也是有意义的,因为如果是int之类的元素,本身相当于键值,更改键值就破坏了原来红黑树的结构了。但是,有些情况下,我们自定义了一些数据结构,但是需要更改结构的非键值部分,此时不想拿出再插入。更特别的情况是元素的不可构造和不可移动的,此时就需要一个更一般的方案。

一个通用的解决方案是,把结构中可能需要更改的元素使用智能指针进行保存,利用find函数找到结构的索引,再通过索引获取指针进行操作。

代码

代码给出的是一个最特殊的例子,不仅仅想直接更改,而且元素是不可复制和不可移动的。

#include <iostream>
#include <string>
#include <mutex>
#include <set>
#include <memory>
#include <string>
#include <utility>struct Object {int fd;std::shared_ptr<std::mutex> mtx;std::shared_ptr<std::string> msg;Object(int _fd) {fd = _fd;mtx = std::make_shared<std::mutex>();msg = std::make_shared<std::string>();}bool operator<(const Object& obj)const {return fd < obj.fd;}bool operator==(const Object& obj)const {return fd == obj.fd;}
};int main() {std::set<Object> objSet;objSet.emplace(Object(1));auto it = objSet.find(Object(1));auto p = it->msg;  // 这里获取指针,就可以直接操作了*p += "hello world !";std::cout << *(it->msg) << std::endl;return 0;
}

C++直接修改std::set元素的方法相关推荐

  1. js来控制、修改CSS伪元素的方法

    例如,我的样式表有以下规则,需要把伪元素的content内容进行修改 <style>p:after{content:'after伪元素'} </style> <p id= ...

  2. js数组中修改元素的方法

    数组中添加元素的方法 .push() .unshift() .splice() .concat() -扩展运算符 数组中删除元素的方法 .pop() .shift() .splice() 数组中截取元 ...

  3. python写错了怎么更改-Python中修改字符串的四种方法

    在Python中,字符串是不可变类型,即无法直接修改字符串的某一位字符. 因此改变一个字符串的元素需要新建一个新的字符串. 常见的修改方法有以下4种. 方法1:将字符串转换成列表后修改值,然后用joi ...

  4. python字符串中某个字符修改_Python中修改字符串的四种方法

    在Python中,字符串是不可变类型,即无法直接修改字符串的某一位字符. 因此改变一个字符串的元素需要新建一个新的字符串. 常见的修改方法有以下4种. 方法1:将字符串转换成列表后修改值,然后用joi ...

  5. js入门·表单详解一(修改表单属性,修改表单元素值)

    实在javascript入门·Document对象入门讲解(访问表单,创建新页,获取页标题) 一文中,我们已经把表单的一些基本访问等弄清楚了,下面我们深入的学下表单的属性以及对表单元素的简单操作! 演 ...

  6. 获取顺序容器vector,deque,string和array的首尾元素的方法有四个

    获取顺序容器vector,deque,string和array的首尾元素的方法有四个: (1)迭代器 (2)下标 (3)front() 和 back()成员函数 (4)at()成员函数 如下所示,得到 ...

  7. hashmap移除元素_Java HashMap 如何正确遍历并删除元素的方法小结

    (一)HashMap的遍历 HashMap的遍历主要有两种方式: 第一种采用的是foreach模式,适用于不需要修改HashMap内元素的遍历,只需要获取元素的键/值的情况. HashMap myHa ...

  8. c语言一个数组后添加元素append,jQuery 追加元素、拼接元素的方法总结(append、html、insertBefore、before等)...

    1. append & appendTo 的功能均为:在被选元素结尾(仍在元素内部)插入指定内容,但是内容和选择器的位置不同 (1) append()方法: $("#test&quo ...

  9. js判断数组里是否有重复元素的方法

    转: js判断数组里是否有重复元素的方法 https://blog.csdn.net/longzhoufeng/article/details/78840974 第一种方法:但是下面的这种方法数字字符 ...

最新文章

  1. Android用户界面设计学习之旅-第二站
  2. .ascx是什么文件?
  3. python的django框架与springboot_Python系统教学|为什么Django框架在Python开发很重要?...
  4. 牛客 - 牛牛的最大兴趣组(思维+数论)
  5. 线性降维:PCA、LDA、MDS
  6. LeetCode 674. Longest Continuous Increasing Subsequence
  7. 使用线性回归识别sklearn中的手写数字digit
  8. python语言的主网址-怎么用Python提取域名中的主域名
  9. 虚拟化架构下虚拟交换机和分布式虚拟交换机解析
  10. vs python opencv配置_OPENCV入门教程二:opencv+VS2015开发环境配置
  11. hadoop快速入门
  12. 苍井空详细介绍(婚后生活)
  13. 本科计算机专业毕业设计论文写作指南
  14. java计数器_Java高效计数器
  15. UE编辑器去掉*.bak备份文件
  16. h5(html5)入门
  17. GitHub 的设置代码上传
  18. 此生,依旧是我未看破红尘。
  19. 苹果三代耳机_苹果AirPodsPro三代耳机 升级版本 苹果AirPods二代耳机
  20. 如何区别随身WiFi板子是什么芯片

热门文章

  1. htmlselect保留上次选择内容_搬家买什么工具,搬家有什么技巧,搬家选择什么公司?...
  2. HNU 实验七 字符串 E-mail地址
  3. PL-SLAM Real-time monocular visual SLAM with points and lines
  4. 【基础数论】欧拉函数
  5. 《南溪的目标检测学习笔记》——neck组件的设计笔记
  6. Anaconda——conda换源可以直接通过conda命令来实现
  7. hdu4135容斥原理 组合遍历
  8. 【设计模式】适配器模式(Adapter Pattern)
  9. struts2.0+spring intercepter 不能注入属性
  10. JadClipse反编译工具在MyEclipse中的安装(先看Eclipse的配置方式)