C++ unordered_map operator[ ] vs unordered_map.find() perfor
C++ unordered_map operator[ ] vs unordered_map.find() performance
我正在tebourchbit.com上解决一个竞争性编程问题我基本上使用unordered_map来跟踪访问的数字。当我使用操作员[]时,我的代码无法及时执行,但是当我使用时,它会通过所有测试。两者都应该具有同一时间的复杂性。
我通过运行10次并平均运行时间来尝试使用Clock((进行计时两个代码,并且它们都给出了或多或少的时间。我使用了G 7.4.0,而网站提供的环境具有G 4.8.4。这可能是这样做的原因。
int Solution::solve(vector<int> &A) {
unordered_map<long long, int> hashmap;
for(auto a : A)
hashmap[a] = 1;
int res = 0;
for(int i = 0; i < A.size(); ++i){
for(int j = i + 1; j < A.size(); ++j){
// if(hashmap.find((long long)A[i] + A[j]) != hashmap.end())
if(hashmap[(long long)A[i] + A[j]] == 1)
++res;
}
}
return res;
}
问题是在数组中也存在数组中也存在。当我使用[]运算符时,我在大约900的数组大小上得到了"超过时间限制"。
[]操作员会慢于:
有两个原因- [] - 操作员在地图上调用了非const函数,可以正确防止各种优化,例如循环展开。
- 更重要的原因是:[] - 操作器在地图中创建具有默认值的不存在的元素。地图将用所有[i] a [j]对的所有对,这些图以前不在地图中,并将其值设置为0。这将增加地图的大小,从而增加时间。
我认为您的性能测量结果在两个或多个原因之间没有差异:
:- 输入向量太小而无法有所作为
- [i] a [j]的大多数组合已经在向量中,因此unordered_map不够肿,无法有所作为
- 您没有优化代码(-o3或-os(您的代码
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 使用一个考虑到std::map中键值的滚动或换行的键
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 允许从 std::map 的密钥窃取资源?
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 使用字符数组作为 Map 中的键
- C++如何创建 std::map
- C++ equivalent to Java Map getOrDefault?
- 从其他容器中移动构造"std::map"
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- C++中 std::map 的运行时复杂度是多少?
- unordered map -在c++ std::unordered_map中预分配桶