缓存类为啥使用 unordered_map 而不是 map

ops/2025/2/8 23:01:42/
  • 性能考虑
    • std::unordered_map 是基于哈希表实现的,而 std::map 是基于红黑树实现的。
    • 对于查找操作,std::unordered_map 的平均查找时间复杂度是 O ( 1 ) O(1) O(1),而 std::map 的查找时间复杂度是 O ( l o g n ) O(log n) O(logn)。这意味着在大多数情况下,std::unordered_map 能更快地找到元素,特别是当元素数量较大时,性能优势更明显。
    • 在这个缓存类的实现中,get 操作需要频繁地查找元素,使用 std::unordered_map 可以提高查找性能。
  • 元素顺序
    • std::map 中的元素是按照键的大小顺序存储的,因为它基于二叉搜索树。这在需要元素有序存储的场景下很有用,但对于缓存类来说,元素的存储顺序通常并不重要。
    • std::unordered_map 中的元素是无序存储的,更适合不需要元素排序的场景,因为它不会花费额外的时间和空间来维护元素的顺序。

示例对比

  • 假设你有一个 std::map<int, int> 和一个 std::unordered_map<int, int>,它们都存储了 n 个元素。
    • 当你使用 map[key] 查找元素时,std::map 需要进行多次比较操作,最多需要 O ( l o g n ) O(log n) O(logn) 次,因为它要在红黑树中搜索元素。
    • 对于 std::unordered_map,它会根据键的哈希值快速定位元素,平均只需要 O ( 1 ) O(1) O(1) 次操作。

代码示例

#include <iostream>
#include <map>
#include <unordered_map>
#include <string>
#include <chrono>int main() {std::map<int, std::string> ordered_map;std::unordered_map<int, std::string> unordered_map;// 插入元素for (int i = 0; i < 1000000; ++i) {ordered_map[i] = "value" + std::to_string(i);unordered_map[i] = "value" + std::to_string(i);}// 测试 std::map 的查找性能auto start = std::chrono::high_resolution_clock::now();for (int i = 0; i < 1000000; ++i) {auto it = ordered_map.find(i);}auto end = std::chrono::high_resolution_clock::now();std::chrono::duration<double> ordered_time = end - start;std::cout << "std::map find time: " << ordered_time.count() << " seconds" << std::endl;// 测试 std::unordered_map 的查找性能start = std::chrono::high_resolution_clock::now();for (int i = 0; i < 1000000; ++i) {auto it = unordered_map.find(i);}end = std::chrono::high_resolution_clock::now();std::chrono::duration<double> unordered_time = end - start;std::cout << "std::unordered_map find time: " << unordered_time.count() << " seconds" << std::endl;return 0;
}

代码解释

  • 这段代码创建了一个 std::map 和一个 std::unordered_map,并插入了 100 万个元素。
  • 然后,分别使用 find() 方法查找元素,并使用 std::chrono 库来测量查找操作的时间。
  • 你会发现 std::unordered_map 的查找时间通常会比 std::map 短,尤其是当元素数量很大时。

总结

  • 在实现缓存类时,性能通常是重要的考虑因素,因为缓存的主要目的是快速存储和获取数据。
  • 由于 std::unordered_map 具有更快的查找性能和不需要元素排序的特点,更适合作为存储键值对的容器,以实现高效的 getput 操作。
  • 然而,如果你的应用场景需要元素按键的顺序存储和访问,那么 std::map 会是更好的选择。但对于缓存类,通常不需要元素有序,因此 std::unordered_map 是更好的选择。

http://www.ppmy.cn/ops/156826.html

相关文章

单硬盘槽笔记本更换硬盘

背景 本人的笔记本电脑只有一个硬盘槽&#xff0c;而且没有M.2的硬盘盒&#xff0c;只有一个移动硬盘 旧硬盘&#xff1a;512G 新硬盘&#xff1a;1T 移动硬盘&#xff1a;512G 参考链接&#xff1a;https://www.bilibili.com/video/BV1iP41187SW/?spm_id_from333.1007.t…

使用 CSS 实现透明效果

在 CSS 中&#xff0c;实现透明效果有几种方法&#xff0c;具体使用哪种方法取决于具体需求。以下是一些常见的方法&#xff1a; 使用 opacity 属性&#xff1a; opacity 属性可以设置整个元素的透明度&#xff0c;包括其所有的子元素。 .transparent { opacity: 0.5; /* 0 表…

maven如何分析指定jar包的依赖路径

在Maven项目中&#xff0c;分析指定JAR包的依赖路径是非常有用的&#xff0c;尤其是在解决依赖冲突时。Maven提供了一个命令行工具来帮助查看特定依赖的传递性依赖&#xff08;即依赖路径&#xff09;。以下是具体步骤&#xff1a; 使用 mvn dependency:tree 命令 打开命令行或…

微软发布基于PostgreSQL的开源文档数据库平台DocumentDB

我们很高兴地宣布正式发布DocumentDB——一个开源文档数据库平台&#xff0c;以及基于 vCore、基于 PostgreSQL 构建的 Azure Cosmos DB for MongoDB 的引擎。 过去&#xff0c;NoSQL 数据库提供云专用解决方案&#xff0c;而没有通用的互操作性标准。这导致对可互操作、可移植…

Mixture of Experts(专家混合模型)深入解析:突破传统神经网络的计算瓶颈

在深度学习领域&#xff0c;随着模型规模的不断扩大&#xff0c;计算资源的需求也变得愈发庞大。为了解决这一问题&#xff0c;许多新兴的模型架构开始涌现&#xff0c;其中 Mixture of Experts (MoE)&#xff08;专家混合模型&#xff09;因其高效的计算方式&#xff0c;成为了…

202412 青少年软件编程等级考试C/C++ 二级真题答案及解析

第 1 题 逆行 题目描述 网上有个段子说&#xff1a;妻子在家听广播&#xff0c;听到某高速路上有一辆车在逆行&#xff0c;想到丈夫在那条高速上行驶&#xff0c;就打电话对丈夫说&#xff1a;“老公啊&#xff0c;你走的那条高速上有一辆车在逆行&#xff0c;你小心点。”她丈…

使用 Ollama 在 Windows 环境部署 DeepSeek 大模型实战指南

文章目录 前言Ollama核心特性 实战步骤安装 Ollama验证安装结果部署 DeepSeek 模型拉取模型启动模型 交互体验命令行对话调用 REST API 总结个人简介 前言 近年来&#xff0c;大语言模型&#xff08;LLM&#xff09;的应用逐渐成为技术热点&#xff0c;而 DeepSeek 作为国产开…

计算机网络之数据链路层

数据链路层是OSI参考模型中的第二层&#xff0c;主要负责通过一条链路从一个节点向另一个物理链路直接相连的相邻节点传送数据报。 一、基本概念 结点&#xff1a;主机、路由器等网络设备。 链路&#xff1a;网络中两个结点之间的物理通道&#xff0c;如双绞线、光纤和微波等…