当前位置: 首页 > web >正文

std::unordered_map 和 std::map的区别【C++】

std::unordered_mapstd::map 是 C++ 标准库中两种不同的关联容器,它们都用于存储键值对,但在实现方式、性能特点和使用场景上存在显著区别。以下是它们的主要区别:

1. 数据结构

  • std::map
    • 基于 红黑树(一种自平衡二叉搜索树)实现。
    • 键值对按照键的顺序存储,支持有序遍历。
  • std::unordered_map
    • 基于 哈希表 实现。
    • 键值对存储在哈希表中,不保证顺序。

2. 性能特点

  • 查找操作
    • std::map:平均时间复杂度为 O(log n),因为需要在红黑树中进行二分查找。
    • std::unordered_map:平均时间复杂度为 O(1),但在最坏情况下(大量冲突)可能退化到 O(n)
  • 插入操作
    • std::map:平均时间复杂度为 O(log n),因为需要在红黑树中插入节点并保持平衡。
    • std::unordered_map:平均时间复杂度为 O(1),但在最坏情况下可能退化到 O(n)
  • 删除操作
    • std::map:平均时间复杂度为 O(log n),因为需要在红黑树中删除节点并保持平衡。
    • std::unordered_map:平均时间复杂度为 O(1),但在最坏情况下可能退化到 O(n)

3. 内存使用

  • std::map
    • 内存使用较为紧凑,因为红黑树的节点结构相对简单。
  • std::unordered_map
    • 通常需要预留一定的空间来减少冲突,因此可能占用更多的内存。

4. 顺序

  • std::map
    • 键值对按照键的顺序存储,支持有序遍历。
    • 可以通过迭代器按顺序访问所有元素。
  • std::unordered_map
    • 不保证键值对的顺序,遍历时的顺序是不确定的。

5. 适用场景

  • std::map
    • 适用于需要按键的顺序访问元素的场景。
    • 适用于需要频繁进行范围查询的场景。
  • std::unordered_map
    • 适用于需要快速查找、插入和删除操作的场景。
    • 适用于键的顺序不重要的场景。

示例代码

std::map
#include <iostream>
#include <map>int main() {std::map<int, std::string> m;m[1] = "one";m[3] = "three";m[2] = "two";// 遍历 map,按键的顺序输出for (const auto& pair : m) {std::cout << pair.first << ": " << pair.second << std::endl;}return 0;
}
std::unordered_map
#include <iostream>
#include <unordered_map>int main() {std::unordered_map<int, std::string> um;um[1] = "one";um[3] = "three";um[2] = "two";// 遍历 unordered_map,顺序不确定for (const auto& pair : um) {std::cout << pair.first << ": " << pair.second << std::endl;}return 0;
}

总结

  • std::map
    • 基于红黑树实现,支持有序遍历。
    • 查找、插入和删除操作的平均时间复杂度为 O(log n)。
    • 适用于需要按键的顺序访问元素或进行范围查询的场景。
  • std::unordered_map
    • 基于哈希表实现,不保证顺序。
    • 查找、插入和删除操作的平均时间复杂度为 O(1)。
    • 适用于需要快速查找、插入和删除操作的场景。

选择哪种容器取决于你的具体需求,例如是否需要有序遍历、是否需要高效查找等。

http://www.xdnf.cn/news/17070.html

相关文章:

  • 【开发备忘】下载并本地部署天地图WMTS服务
  • 文本换行问题
  • Node.js 操作 MySQL
  • SpringAI的使用
  • Mysql的MVCC是什么
  • 基于开源AI智能客服、AI智能名片与S2B2C商城小程序的餐饮行业私域流量运营策略研究
  • 数据结构-双链表
  • 【数据分享】各省粮食外贸依存度、粮食波动率等粮食相关数据合集(2011-2022)(获取方式看文末)
  • MCP革命:AI世界的“USB-C”接口如何重塑智能体与外部工具的连接
  • 信号传播速度与延时
  • 机器学习——下采样(UnderSampling),解决类别不平衡问题,案例:逻辑回归 信用卡欺诈检测
  • 【2025ICCV-目标检测方向】WaveMamba:用于 RGB-红外目标检测的小波驱动曼巴融合
  • 从零开始实现Qwen3(Dense架构)
  • template<typename R = void> 意义
  • 构建企业级Web应用:AWS全栈架构深度解析
  • ⭐CVPR2025 FreeUV:无真值 3D 人脸纹理重建框架
  • IDEA查看源码利器XCodeMap插件
  • DMDRS产品概述和安装部署
  • 服务端⾼并发分布式结构演进之路
  • 每日面试题19:深拷贝和浅拷贝的区别
  • All the Mods 9 - To the Sky - atm9sky 局域网联机报错可能解决方法
  • 玩转 Playwright 有头与无头模式:消除差异,提升爬虫稳定性
  • 人声伴奏分离API:音乐智能处理的强大工具
  • 提升工作效率的利器:Qwen3 大语言模型
  • [LeetCode优选算法专题一双指针——有效三角形的个数]
  • Android 之 图片加载(Fresco/Picasso/Glide)
  • [硬件电路-140]:模拟电路 - 信号处理电路 - 锁定放大器概述、工作原理、常见芯片、管脚定义
  • 多模态大模型综述:BLIP-2详解(第二篇)
  • GraphRAG:基于知识图谱的检索增强生成技术解析
  • 【QT】常⽤控件详解(二)windowOpacitycursorfontsetToolTipfocusPolicystyleSheet