为啥我在地图stl中搜索时差很大?
Posted
技术标签:
【中文标题】为啥我在地图stl中搜索时差很大?【英文标题】:why I search in map stl time difference is a lot?为什么我在地图stl中搜索时差很大? 【发布时间】:2020-06-26 13:56:07 【问题描述】:当我使用std::map
时,根据所使用的方法,访问元素所需的时间似乎不同。
第一种方法:直接访问
cnt += umap[t];
第二种方法:
if (umap.find(t) != umap.end())
cnt += umap[t];
第二种方法似乎比第一种方法快很多,我不明白为什么。有人能解释一下这两种方法的区别吗?
【问题讨论】:
你是如何测量时间的?你是如何编译代码的?优化开启了吗?你使用了什么编译器和标志?为什么你认为一个比另一个快会有问题? 我们可以得到这个基准的minimal reproducible example 吗?根据数据集和您正在执行的操作,可能会有差异,也可能没有差异。umap[t]
如果默认值不存在条目,则创建新条目。使用if
检查您正在阻止创建新项目。
请注意,这 2 个 sn-ps 正在做不同的事情。第一个可以增加地图大小,肯定会有性能差异。
(我保证至少有一个人会从上面的评论中发现if
's init-statement)
【参考方案1】:
每个代码 sn-ps 都在做不同的事情。
第一个 sn-p 需要更多时间,因为它在将密钥 t
插入到 umap
之前,如果它不存在(并将其初始化为零),然后将其添加到 cnt
。
在第二个 sn-p 中没有插入任何密钥。由于if
条件,只有当umap
具有密钥t
时,umap[t]
才会(然后调用)添加到cnt
。
第二个sn-p可以通过临时存储find
返回的迭代器来进行更优化。在第二个 sn-p 中,operator[]
内部再次调用了find
方法,这反过来又增加了时间复杂度。
因此,这样的尝试会更快(摘自user253751 的评论):
if(auto it = umap.find(t); it != umap.end())
cnt += it->second;
【讨论】:
以上是关于为啥我在地图stl中搜索时差很大?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我在 Google 地图中使用 GroundOverlay 设置图像时会变形?
有时我在 Android Studio 中遇到谷歌地图问题,但并非总是如此。为啥?如何删除谷歌地图上方的白条?