unordered_map: find() 和 count() 哪个更快?

Posted

技术标签:

【中文标题】unordered_map: find() 和 count() 哪个更快?【英文标题】:unordered_map: which one is faster find() or count()? 【发布时间】:2013-01-04 15:09:04 【问题描述】:

判断unordered_map 容器是否包含具有指定键的项目的最快方法是什么?

【问题讨论】:

【参考方案1】:

它们的性能大致相同。您应该使用最能表达您想要做的事情的算法。

为了详细说明,通常count() 将使用find() 实现。例如libcxx中,count()实现为return (find(__k) != end());

【讨论】:

【参考方案2】:

find()count() 适用于 C++ 中的许多容器。

对于地图、集合等,find() 将始终具有恒定的执行时间,因为它只是计算哈希,并返回一个迭代器到找到的第一个元素(end(),如果没有找到)。

另一方面,count() 具有恒定的执行时间 O(e),其中 e 是找到提供的密钥的次数。最坏的情况是所有成员都相同的集合,因此count() 的复杂度可能为 O(n)

mapunordered_map 不允许重复,因此它们的渐近运行时间相同。

选择取决于代码中的语义。如果您只想检查密钥是否存在,您可以使用count。如果您想检查某个键是否存在并使用它的值,请选择find,因为您已经有一个指向该元素的迭代器。

【讨论】:

这不是真的。你是说find() 会返回一个指针,即使实际搜索的值不存在,但它存在哈希冲突。 一个更好的反对意见是“总是有恒定的执行时间”是不正确的,因为这是摊销和最好的情况,但在最坏的情况下,查找可能是线性时间,即它倾向于这样哈希冲突的比例增加。另一个更迂腐的反对意见是,这仅适用于 无序 映射和集合;那些没有因此装饰的东西是有序的并且(通常)更慢。【参考方案3】:

C++20 通过提供contains 方法结束了这一困境,它仍然具有相同的性能,但直接说出了你的意思。

【讨论】:

以上是关于unordered_map: find() 和 count() 哪个更快?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ unordered_map 中有效地使用 [] 运算符

boost::unordered_map() 的 find() 方法的问题

std::unordered_map::find 使用不同于 Key 类型的类型?

c++ stl unordered_map 如何打印其所有值?

Unordered_Map 查找时间

std::find (unordered_)map