unordered_map中"查找"或"在"哪个更快?
Which one is faster "find" or "at" in unordered_map?
我知道对于无序映射,"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);
}
正如你所看到的,它们几乎是一样的,应该有相同的性能。
它们是一样的。如果您在
中查找和查看文档你可以看到复杂度是:
平均大小写:常数。最坏的情况:容器大小成线性。
相关文章:
- 如何从map<pair<string,int>,pair<string,Array>>中迭代和查找?
- 使用STD :: MAP在数据及其性能问题中查找重复项.我可以预先分配吗?
- 查找并插入-STD :: MAP C
- 对于关键字查找,std::vector比std::map快
- 如何创建一个以键为输入并在C++std:map中查找值的模板函数
- 如何实现 std::map::查找包含两个结构'Pos'结构的比较逻辑,每个结构包含 x 和 y 坐标
- STD :: SET(或STD :: MAP)是否有一个提供基于值的查找的STL比较器?STD :: lands_les
- 如何有效查找大型std :: map
- STD :: MAP-如何查找或添加,然后可以在一次搜索中删除项目
- 标准::map 中的容错键查找
- std::map{'0',0}对在char'0'用作查找
- std::map:仅使用部分键类型进行比较和查找
- A* 路径查找中 std::map 性能的视觉C++性能问题
- STL MAP 应该使用 find() 或 [n] 标识符来查找 map 中的元素
- 使用 STL Map 查找该对中第一个元素的最低键对
- 哪个性能更快?具有 N 个派生类型的 vtable 查找,或具有 N 个元素的 std::map 查找
- 对在 std::map 的查找/插入上使用可升级锁感到困惑
- 检查 std::map 中是否存在 - 计数与查找
- std::map的查找无法找到,但地图中的元素通过手动扫描
- 在map查找中没有找到Const char*