std :: map是否支持缓存?

时间:2013-05-04 10:47:00

标签: c++ map stl

例如:

代码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是否提供了一个功能,可以将最后一个搜索项存储在缓存中并更快地搜索相同的项目,还是仅在整个地图中执行第二次搜索?

3 个答案:

答案 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;

简短,干净,易于理解。 (并且它避免了多次返回,这使得对程序正确性的推理如此困难。)