在shared_ptr的unordered_set中查找值

时间:2015-09-16 15:50:18

标签: c++ shared-ptr unordered-set

我想在unordered_set中找到一个值,但是失败了:

typedef std::shared_ptr<int> IntPtr;

std::unordered_set<IntPtr> s;
s.insert(std::make_shared<int>(42));

bool found = s.find(std::make_shared<int>(42)) != s.end();
cout<<std::boolalpha<<found<<endl; // false

曾尝试过但仍然没有工作。

namespace std {
  template <> struct hash<IntPtr> {
    size_t operator()(const IntPtr& x) const noexcept {
      return std::hash<int>()(*x);
    }
  };
}

知道如何让它有效吗?

2 个答案:

答案 0 :(得分:5)

您将指针存储到整数。当您在集合中查找项目时,您不会比较(指向的)整数,而是指针本身。

当为搜索分配 new 整数对象的 new 指针时,它不会比较相等,因为它是一个不同的整数对象(即使它存储相同的值)。

您的选择是:

  1. 不要存储指向集合中整数的指针,只需直接存储整数。

    然后,您的密钥为42,搜索42会找到它,因为整数按值进行比较

  2. 存储指针并使用自定义散列和比较器来比较指向的整数而不是指针。

    你不应该(尝试)用你的哈希特化污染std名称空间,并且它无论如何都不够(哈希用于存储桶查找,但密钥仍然与{在桶内{1}}。只需为容器指定

  3. #2的示例代码:

    KeyEqual

答案 1 :(得分:1)

根据here

  

请注意,shared_ptr的比较运算符只是比较指针值;指向的实际对象不进行比较。

只有当found指向同一个对象时,shared_ptr才会成立:

typedef std::shared_ptr<int> IntPtr;

std::unordered_set<IntPtr> s;
IntPtr p = std::make_shared<int>(42);
s.insert(p);

bool found = s.find(p) != s.end();
cout<<std::boolalpha<<found<<endl; // true