我知道对于无序地图,"找到" " at"返回一个迭代器。返回映射的值。我只是好奇哪一个更快。
答案 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)