0

我正在编写一个数值模拟程序,使用 std::map 存储一些键值对。该地图用于存储模拟过程中演变的状态。键的类型是整数,对应于键的值表示相同键的副本数,即std::map。对于模拟的每一步,我都需要计算同一个键有多少个值,所以我将通过以下代码进行检查

if (map[key]>0) {do something here with the number of copies}

但是,我很快发现这段代码不起作用,因为即使映射中没有这样的键,每当您调用 map[key] 时,它都会为该键生成一个占位符并将值设置为零;因此,我总是用 std::map.size() 多算键的总数。我稍后将代码更改如下以搜索密钥

if (map.find(key)!=map.end()) {...}

那么这是检查地图是否存在密钥的唯一且最快的方法吗?我将运行模拟数亿次,它会经常调用上面的代码来检查密钥。改用 map.find() 会不会太慢?谢谢。

4

4 回答 4

2

find成员函数可能是查找键是否已在映射中的最快方法。也就是说,如果您不需要按顺序迭代地图中的项目,那么您可能会获得更好的性能std::unordered_map

于 2012-04-19T04:48:25.330 回答
1

在 astd::map或 hashtable ( std::unordered_map) 中,该find函数非常快,与使用[]下标运算符一样快。实际上,在没有找到元素的情况下更快,因为它不必插入一个。

于 2012-04-19T04:47:40.663 回答
1

我认为检查密钥是否存在的各种方法在速度上没有太大差异。另一方面:如果你的键是整数并且范围是已知的,你可能只使用数组。

BTW:我对简单数组、向量、地图和无序地图的速度很感兴趣。我编写了简单的程序,它执行 100000000 container[n]++,其中 n 是 0 到 10000 范围内的随机数。结果:

  • 数组:1.27s
  • 矢量:1.36s
  • 无序地图:2.6s
  • map: 11.6s 这个简单情况下循环+索引计算的开销约为0.8s。

所以这一切都取决于在其他地方花费了多少时间。如果它更多(每 100000000 次迭代),那么你使用什么并不重要。但如果不是,那可能会有很大的不同。

于 2012-04-19T04:49:08.763 回答
0

您可以使用 hash_map,它是您的键值类型最快的数据结构;

你也可以使用 map,但它比 hash_map 慢

于 2012-04-19T08:08:11.817 回答