在C++ STL中,将指针作为unordered_map的键进行哈希处理。

25

我发表了一个类似的问题,涉及在C++ STL中将指针用作映射的键。当将指针用作键时,unordered_map中的哈希是如何进行的。更具体地说,如果我定义:

std::unordered_map< CustomClass*, int > foo;

默认的C++ std::hash实现能够处理这些指针吗?使用它是否安全?这是一个好的做法吗?


你可能是指std :: unordered_map,答案实际上是相同的:如果您确实想要哈希指针(而不是它们指向的对象),则可以使用指针。您也可以实现自己的哈希(或哈希重定向)以处理指向的对象。 - firda
是的,那就是我想说的!我已经编辑过帖子进行更正了。谢谢! - Ammar Husain
1个回答

32

std::hash<T*>已经定义,但其操作细节取决于实现。只要你需要的是指针而不是对象内容本身作为键,那么它肯定是安全可靠的,并且我认为这是一个好的实践。


为什么指针需要是指向键而不是整个对象的指针?如果我想让键成为指向对象本身的指针,会怎样? - echo
2
@echo 我认为你没有理解我的观点 - 指针本身就是关键,而不是指向关键的指针。因此,即使键对象的内容相同,在unordered_map中两个对象也将是分开的。 - Mark Ransom
啊,好的,我误解了您原来的评论,但现在在新的上下文中重新阅读,我明白您当时想说什么了。在对象内容可以对于两个不同的对象是相同的,并且这些对象没有唯一键/标识符的情况下,您可能需要哈希对象指针。 - echo
一个重要的考虑因素是确保在指向的对象被释放时删除条目,因为该地址可能稍后会被不同的对象重新使用。 - kylefinn
@kylefinn 我曾经使用过这种技术,我使用对象中的析构函数将其从表格中移除。我还为不同的类使用了不同的表格,因此不存在混合不相关类型的可能性。仍然可能会有轻微的机会重用相同地址来创建同一类型的不同对象,但至少不会冒着未定义行为的风险。 - Mark Ransom
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接