1. 程式人生 > >C++直接修改std::set元素的方法

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

簡介

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