版权声明:所有的博客都是个人笔记,交流可以留言或者加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;
}