std::map是否支持缓存?

Does std::map support caching?

本文关键字:缓存 支持 是否 map std      更新时间:2023-10-16

例如:

code1:

if((iter = map.find(key)) != map.end()) {
    return iter->second;
}
return 0;

code2:

if(map.count(key) > 0) {
    return map.at(key);
}
return 0;

code2要简单得多,但map.count()map.at()都花费O(logn)时间。是否std::map提供了一个功能,存储在缓存中的最后一个搜索项目,使搜索相同的项目更快,或者它只是执行第二次搜索在整个地图?

它在整个映射中进行搜索,没有进行缓存——或者至少,标准没有强制要求任何缓存,我想说没有实现这样做,因为所有客户端在每次插入/删除后都必须支付可能不希望的更新缓存信息的开销。

第一种方法是确定映射中是否包含键/值对的惯用方法(请注意应该使用operator ->而不是operator .,因为您从find()获得的是一个迭代器,并且对iter的赋值应该在if条件之外):

auto iter = map.find(key);
if (iter != map.end()) {
    return iter->second;
}

不,据我所知,没有一个c++标准库实现使用缓存。c++ 11要求容器对于多个读取器是线程安全的。为了实现这一点,对缓存的访问需要同步。这将导致速度损失,即使你不想这样。c++的一个标准实践是,你不应该为任何你不明确需要或不想要的东西买单。

可以,但据我所知没有人这样做。惯用的解决方案是因此,使用一个变量:

auto results = myMap.find( key );
return results == myMap.end()
    ? NULL
    : &results->second;

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

没有提到的是,尽管没有搜索的软件缓存,但沿着搜索路径(搜索树)可能会有指针的硬件缓存,因此在第一次搜索之后立即进行第二次搜索应该会快得多。