我正在编写一个数值模拟程序,使用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()会变得太慢吗?感谢。
答案 0 :(得分:2)
find
成员函数可能是查找某个键是否已存在于地图中的最快方法。也就是说,如果您不需要按顺序迭代地图中的项目,那么使用std::unordered_map
可能会获得更好的效果。
答案 1 :(得分:1)
在std::map
或哈希表(std::unordered_map
)中,find
函数非常快,与使用[]
下标运算符一样快。实际上,当找不到元素时它会更快,因为它不必插入元素。
答案 2 :(得分:1)
我不认为检查钥匙存在的各种方法的速度有很大差异。另一方面:如果你的键是整数并且范围已知,你可能只使用数组。
顺便说一句: 我对简单数组,矢量,地图和无序地图的速度感兴趣。我写了一个简单的程序,它做100000000 container [n] ++,其中n是一个0到10000范围内的随机数。结果:
所以这一切都取决于在其他地方花了多少时间。如果它相当多(每100亿次迭代)那么你使用它并不重要。但如果不是,那就完全不同了。
答案 3 :(得分:0)
你可以使用hash_map,它是键值类型最快的数据结构;
你也可以使用map,但它比hash_map
慢