c++ unordered_set with shared_ptr 搜索原始指针

c++ unordered_set with shared_ptr search for raw pointer

我有一个 unordered_set,以 shared_ptrs 作为键。这在 99% 的情况下工作正常,但在相同的情况下,我需要从 class 内部搜索集合,我想避免继承 enable_shared_from_this,正因为如此。

Can/how 我通过原始指针搜索 shared_ptr 的 unordered_set。

散列一个 shared_ptr 散列 get() 并比较一个 shared_ptr 比较 get(),所以让我们用别名构造函数创建一个非拥有 shared_ptr :

std::shared_ptr<T> key(std::shared_ptr<T>(),
                       this /* or whatever pointer you want to search for */);

然后搜索 unordered_set

与使用空删除器相比,这更便宜,因为它不分配控制块。

不,unordered_set 没有允许您根据 Key 类型的实际实例以外的任何内容进行搜索的功能。

但是,shared_ptr<T> 有 3 个重要的功能可以让您获得所需的效果:

  1. std::hash<shared_ptr<T>> 定义为等效于散列 T*.

  2. std::shared_ptroperator==根据shared_ptr::get.

  3. 比较指针
  4. 您可以创建一个 shared_ptr,它有一个实际上并不删除对象的删除器。

因此,您可以创建一个假 shared_ptr:

T *ptr = this;
auto sp = shared_ptr<T>(ptr, [](T*) {} );
auto it = the_set.find(sp);

只要 sp 没有超出您的范围(您 真的 不想保留它),就可以了。