我想在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);
}
};
}
知道如何让它有效吗?
答案 0 :(得分:5)
您将指针存储到整数。当您在集合中查找项目时,您不会比较(指向的)整数,而是指针本身。
当为搜索分配 new 整数对象的 new 指针时,它不会比较相等,因为它是一个不同的整数对象(即使它存储相同的值)。
您的选择是:
不要存储指向集合中整数的指针,只需直接存储整数。
然后,您的密钥为42
,搜索42
会找到它,因为整数按值进行比较
存储指针并使用自定义散列和比较器来比较指向的整数而不是指针。
你不应该(尝试)用你的哈希特化污染std
名称空间,并且它无论如何都不够(哈希用于存储桶查找,但密钥仍然与{在桶内{1}}。只需为容器指定 。
#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