在 unordered_map 中 "find" 和 "at" 哪个更快?

Which one is faster "find" or "at" in unordered_map?

我知道对于无序映射,"find" returns 是一个迭代器,而 "at" returns 是映射值。我只是好奇哪个更快。

以下是VS2015社区中两个函数的源码

iterator find(const key_type& _Keyval)
    {   // find an element in mutable hash table that matches _Keyval
    return (lower_bound(_Keyval));
    }

mapped_type& at(const key_type& _Keyval)
    {   // find element matching _Keyval
    iterator _Where = _Mybase::lower_bound(_Keyval);
    if (_Where == _Mybase::end())
        _Xout_of_range("invalid unordered_map<K, T> key");
    return (_Where->second);
    }

如你所见,它们几乎相同,应该具有相同的性能。

他们是一样的。 如果您查看 find and at

的文档

可以看到复杂度为:

Average case: constant. Worst case: linear in container size.

你不应该根据速度在两者之间进行选择,选择更能表达你意图的方法。当您使用 at 时,您假设该元素在地图中(否则会出现异常)。 find 情况并非如此。

find 更可能是 noexcept。在某些 compilers/platforms 中,noexcept 函数可以在代码大小上变得更快或更简单,因为不必设置异常 setup/catch/etc。

如果你找到了,如果找不到则抛出,你会得到无法区分的结果。如果你在,然后捕获和分支,你可能会比查找慢(如果编译器没有优化 throw/catch 不存在)。

差异会很小,因此您应该根据其他考虑来选择调用哪个,除非代码对性能至关重要。在那种情况下,profile and teat,不要依赖理论或微基准。