std :: map引用键时的行为

时间:2012-04-19 04:43:45

标签: c++ performance search map stdmap

我正在编写一个数值模拟程序,使用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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

std::map或哈希表(std::unordered_map)中,find函数非常快,与使用[]下标运算符一样快。实际上,当找不到元素时它会更快,因为它不必插入元素。

答案 2 :(得分:1)

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

顺便说一句: 我对简单数组,矢量,地图和无序地图的速度感兴趣。我写了一个简单的程序,它做100000000 container [n] ++,其中n是一个0到10000范围内的随机数。结果:

  • 阵列:1.27s
  • vector:1.36s
  • 无序地图:2.6s
  • 地图:11.6s 在这个简单的情况下,循环+索引计算的开销是~0.8s。

所以这一切都取决于在其他地方花了多少时间。如果它相当多(每100亿次迭代)那么你使用它并不重要。但如果不是,那就完全不同了。

答案 3 :(得分:0)

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

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

相关问题