C++ unordered_set shared_ptr搜索原始指针

c++ unordered_set with shared_ptr search for raw pointer

本文关键字:搜索 原始 ptr 指针 shared unordered set C++      更新时间:2023-10-16

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

我可以/如何通过原始指针搜索shared_ptr unordered_set。

get()哈希

shared_ptr哈希并比较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

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

不,unordered_set 没有允许您基于Key类型的实际实例以外的任何内容进行搜索的函数。

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

  1. std::hash<shared_ptr<T>>被定义为等效于哈希T*

  2. std::shared_ptroperator==比较了基于shared_ptr::get的指针。

  3. 您可以创建一个具有删除程序的shared_ptr,该删除器实际上不会删除对象。

因此,您可以创建一个人造shared_ptr

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

只要sp没有逃脱你的范围(你真的不想把它留在身边(,你就会没事的。