C++直接修改std::set元素的方法
阿新 • • 發佈:2019-01-13
簡介
元素在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;
}