c++ - C++:无序容器如何防止重复?
问题描述
我们以 unordered_set 为例。用于确定两个元素是否相等的默认谓词std::equal_to<T>(t1,t2)
是简单的t1==t2
。现在假设我已经实现了这种 T 类型,operator==()
因此并非所有成员变量都是此比较的一部分,即两个不同的 T 元素 t1,t2 在比较时可以相等。
如果底层哈希表为这些 t1 和 t2 中的每一个计算不同的哈希,它甚至何时执行t1==t2
密钥重复检查?如果有更多检查,它如何平均保持恒定时间?
解决方案
我认为您缺少的关键点是您为无序容器提供了两个仿函数,并且它们必须一起工作。
有哈希函数,它从一个对象计算一个数字。
有一个比较功能,可以比较两个对象的“等价性”。
正如@Eljay 在他的评论中所说,对于比较“等效”(比较函数返回true
)的两个对象,哈希函数必须返回相同的值。
如果您的函数不提供此保证,则容器将无法正常工作。
比较好的参考(虽然不权威)
std::unordered_set:满足 UnorderedAssociativeContainer 的要求。
UnorderedAssociativeContainer:由 Key/Hash/Pred 参数化。
有要求:
* 如果两个 Keys 根据 Pred 相等。
* 哈希必须为两个键返回相同的值。
推荐阅读
- javascript - 如何阅读 Javascript 游戏的关卡计划?
- json - Swift 可编码解析 keyNotFound
- javascript - 如何使用 jest 仅模拟 axios 中的特定路由但仍保持其他路由正常运行
- javascript - 如何在 jQuery 中为 oninput 添加延迟
- android - QUERY_ALL_PACKAGES 是如何执行的?
- gremlin - 如何在 gremlin 控制台中测量时间
- javascript - React 功能组件中的 RxJS
- c# - 为什么 xUnit 测试会抛出 AggregateException?
- javascript - Qualtrics 和 Javascript - 将单词随机插入句子
- html - 解析csv文件,如何确定日期列格式?