为啥我在地图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 中遇到谷歌地图问题,但并非总是如此。为啥?如何删除谷歌地图上方的白条?

web端调用高德地图为啥搜不到地址

为啥我在地图箭头功能中不断收到未定义的错误?

为啥我在 Google 地图上的当前位置在 Android 应用中不正确? [复制]

为啥优步、谷歌地图等印度应用程序中的地图如此不准确?