如何快速确定unordered_map
容器中是否有指定键的元素?
如何快速确定unordered_map
容器中是否有指定键的元素?
它们的性能大致相等。您应该使用最能表达您要做什么的算法。
详细说明一下,通常情况下,count()
将使用 find()
来实现。例如,在libcxx中,count()
实现为 return (find(__k) != end());
C++20 提供了 contains
方法,结束了这一困境,该方法仍具有相同的性能,但直接表达你的意图。
find()
和count()
在C++中适用于许多容器。
对于maps、sets等容器,find()
总是具有恒定的执行时间,因为它只计算哈希值,并返回找到的第一个元素的迭代器(如果没有找到则返回end()
)。
另一方面,count()
具有常数时间O(e),其中e是提供的键出现的次数。最坏情况是集合中所有成员都相同,所以count()
可能具有复杂度O(n)。
map
或unordered_map
不允许重复,因此它们的渐近运行时间将是相同的。
选择取决于您代码中的语义。如果您只想检查键是否存在,可以使用count
。如果您想检查键是否存在并使用其值,则应选择find
,因为您已经有指向该元素的迭代器。
find()
会返回一个指针,即使实际搜索的值不存在,但它存在哈希冲突。 - A1m
contains
的源代码是否与count
完全相同? - Eric