【问题标题】:c++ unordered_set with shared_ptr search for raw pointerc++ unordered_set with shared_ptr 搜索原始指针
【发布时间】:2016-05-15 01:37:10
【问题描述】:

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

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

【问题讨论】:

  • 你到底为什么要在指针上搜索?
  • std::find_if 带有自定义谓词(作为 lambda)?
  • @DanMašek:与普通的unordered_set::find相比,性能会很差
  • @DanMašek find_if 没有利用哈希表 - 使用空删除器创建 shared_ptr 比使用 find_if 更便宜
  • @EdHeal 我不确定你到底是什么意思,但如果你暗示我正在搜索指针的值,我没有这么说,在这种情况下我也没有。在很多情况下,我实际上是这样做的,例如我有一个全局缓存,可确保对象的唯一性,允许通过指针搜索它们,在一般情况下,散列可能更便宜。

标签: c++ unordered-set


【解决方案1】:

散列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

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

【讨论】:

    【解决方案2】:

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

    不过,shared_ptr&lt;T&gt; 有 3 个重要的功能可以让您获得所需的效果:

    1. std::hash&lt;shared_ptr&lt;T&gt;&gt; 被定义为等效于散列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 没有超出你的范围(你真的不想保留它),你会没事的。

    【讨论】:

      猜你喜欢
      • 2012-09-07
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多