哪一个更快"找到"或" at"在unordered_map中?

时间:2015-08-31 12:40:01

标签: c++ find unordered-map

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

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:4)

find更有可能是noexcept。在某些编译器/平台中,noexcept函数可以更快或更简单地编写代码,因为不需要设置异常设置/ catch /等。

如果你发现,那么如果失踪则抛出,你将得到难以区分的结果。如果你在,然后捕获和分支,你可能会比找到慢(如果编译器没有优化抛出/捕获优化)。

差异很小,因此除非代码对性能至关重要,否则应根据其他注意事项选择要调用的内容。在这种情况下,配置文件和奶嘴,不要依赖理论或微基准。

答案 2 :(得分:3)

以下是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);
    }

正如您所看到的,它们几乎相同,并且应该具有相同的性能。

答案 3 :(得分:0)

他们是一样的。 如果您查看findat

的文档

你可以看到复杂性是:

  

平均情况:不变。   最坏情况:容器尺寸呈线性。