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 个重要的功能可以让您获得所需的效果:
std::hash<shared_ptr<T>>
定义为等效于散列 T*
.
std::shared_ptr
的operator==
根据shared_ptr::get
.
比较指针
您可以创建一个 shared_ptr
,它有一个实际上并不删除对象的删除器。
因此,您可以创建一个假 shared_ptr
:
T *ptr = this;
auto sp = shared_ptr<T>(ptr, [](T*) {} );
auto it = the_set.find(sp);
只要 sp
没有超出您的范围(您 真的 不想保留它),就可以了。
我有一个 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 个重要的功能可以让您获得所需的效果:
std::hash<shared_ptr<T>>
定义为等效于散列T*
.std::shared_ptr
的operator==
根据shared_ptr::get
. 比较指针
您可以创建一个
shared_ptr
,它有一个实际上并不删除对象的删除器。
因此,您可以创建一个假 shared_ptr
:
T *ptr = this;
auto sp = shared_ptr<T>(ptr, [](T*) {} );
auto it = the_set.find(sp);
只要 sp
没有超出您的范围(您 真的 不想保留它),就可以了。