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

时间:2016-05-15 01:37:11

标签: c++ unordered-set

我有一个unordered_set,其中shared_ptrs作为键。这在99%的情况下运行良好,但在同样的情况下,我需要从类内部搜索集合,我想避免继承enable_shared_from_this,因为这样。

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

2 个答案:

答案 0 :(得分:6)

哈希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

然后搜索container-2

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

答案 1 :(得分:3)

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

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

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

  2. std::shared_ptr的{​​{1}}根据operator==比较指针。

  3. 您可以创建一个shared_ptr::get,其中包含一个实际上不会删除该对象的删除工具。

  4. 因此,您可以创建一个虚假的shared_ptr

    shared_ptr

    只要T *ptr = this; auto sp = shared_ptr<T>(ptr, [](T*) {} ); auto it = the_set.find(sp); 没有逃避你的范围(你真的不想保留它),你就没事了。