C++直接修改std::set元素的方法

版权声明:所有的博客都是个人笔记,交流可以留言或者加QQ:2630492017 https://blog.csdn.net/qq_35976351/article/details/85331368

简介

元素在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;
}

猜你喜欢

转载自blog.csdn.net/qq_35976351/article/details/85331368
今日推荐