std::map是否支持缓存?
Does std::map support caching?
例如:
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;
简短,清晰,易于理解。(并且它避免了使程序正确性推理如此困难的多次返回。)
没有提到的是,尽管没有搜索的软件缓存,但沿着搜索路径(搜索树)可能会有指针的硬件缓存,因此在第一次搜索之后立即进行第二次搜索应该会快得多。
相关文章:
- 编译时未启用intel oneApi CUDA支持
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用CMake检测支持的C++标准
- 为什么istream不支持右值提取
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 扩展光电二极管探测器以支持多个传感器
- MSVC是否支持C++11样式的属性而不是__declspec
- cmake更新缓存的变量
- 试图对缓存进行跨步测试,但程序并没有结束
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 通过ccmake在cmake中缓存依赖选项
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 哪个C++规范开始支持 std::vector
- 如何检测VS C++编译器是否支持C++11?
- 可以使用缓存使QML应用程序“离线支持”
- std::map是否支持缓存?
- 支持响应缓存的c++网络库
- 支持http 1.1响应缓存的c++库