例如:
代码1:
if((iter = map.find(key)) != map.end()) {
return iter->second;
}
return 0;
码2:
if(map.count(key) > 0) {
return map.at(key);
}
return 0;
code2 要简单得多,但map.count()
和map.at()
都需要花费O(logn)时间。 std::map
是否提供了一个功能,可以将最后一个搜索项存储在缓存中并更快地搜索相同的项目,还是仅在整个地图中执行第二次搜索?
答案 0 :(得分:5)
它搜索整个地图,没有进行缓存 - 或者至少,标准没有强制执行,我会说没有实现它,因为所有客户端一个实现必须支付每次插入/删除后更新缓存信息可能产生的不希望的开销。
第一种方法是确定某个键/值对是否包含在地图中的惯用方法(请注意,应使用operator ->
代替operator .
,因为您从find()
是一个迭代器,iter
的赋值应该在if
条件之外:
auto iter = map.find(key);
if (iter != map.end()) {
return iter->second;
}
答案 1 :(得分:4)
不,据我所知,没有一个C ++标准库实现使用缓存。 C ++ 11要求容器对多个读者来说是线程安全的。并且为了实现这一点,需要同步对高速缓存的访问。即使你不想要它,也会导致速度下降。 C ++的一个标准做法是,你不应该为你没有明确需要或想要的任何东西买单。
答案 2 :(得分:1)
可能,但我知道没有。惯用的解决方案是 因此要使用变量:
auto results = myMap.find( key );
return results == myMap.end()
? NULL
: &results->second;
简短,干净,易于理解。 (并且它避免了多次返回,这使得对程序正确性的推理如此困难。)