unordered_map中"查找"或"在"哪个更快?

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

本文关键字:map 查找 unordered      更新时间:2023-10-16

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

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

find更可能是不例外。在一些编译器/平台中,noexcept函数可以在代码大小上更快或更简单,因为不需要设置异常设置/catch/等。

如果你找到了,然后扔掉它,你会得到无法区分的结果。如果你at,然后catch和branch,你可能会比find慢(如果编译器没有优化throw/catch的存在)。

差异很小,因此您应该根据其他考虑因素选择调用哪个,除非代码对性能至关重要。在这种情况下,概要和测试,不要依赖于理论或微基准。

以下是VS2015 Community中这两个函数的源代码。

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);
    }

正如你所看到的,它们几乎是一样的,应该有相同的性能。

它们是一样的。如果您在

中查找和查看文档

你可以看到复杂度是:

平均大小写:常数。最坏的情况:容器大小成线性。