C++,STL容器,unordered_map/unordered_multimap:无序映射/无序多重映射深入解析

请添加图片描述

文章目录

  • 一、容器概览与核心特性
    • 核心特性对比
  • 二、底层实现原理:哈希表架构
      • 1. 哈希表核心结构
    • 2. 动态扩容机制
  • 三、核心操作详解
    • 1. 容器初始化与配置
    • 2. 元素插入与更新
    • 3. 元素访问与查找
    • 4. 元素删除策略
  • 四、实战应用场景
    • 1. 缓存系统实现
    • 2. 分布式系统路由表
  • 五、性能优化策略
    • 1. 哈希函数优化技巧
    • 2. 内存管理最佳实践
  • 六、注意事项与陷阱
    • 1. 迭代器失效情况
    • 2. 自定义类型关键点
    • 3. 性能对比决策树
  • 七、C++新标准增强
    • 1. C++20 contains方法
    • 2. C++17节点操作
    • 3. C++14异构查找
  • 总结与最佳实践
    • 选择决策指南
    • 性能优化清单
    • 调试技巧


一、容器概览与核心特性

unordered_mapunordered_multimap是C++11引入的哈希关联容器,提供平均O(1)时间复杂度的键值对存储与访问能力。它们与map/multimap的核心区别在于不维护键的顺序,通过哈希表实现快速查找。


核心特性对比

特性 unordered_map unordered_multimap
键唯一性 唯一 允许重复
插入复杂度 平均O(1),最差O(n) 同左
查找复杂度 平均O(1),最差O(n) 同左
内存布局 散列存储 散列存储
头文件 <unordered_map> <unordered_map>

二、底层实现原理:哈希表架构

1. 哈希表核心结构

  • 哈希函数:计算键的哈希值(hash(key) % bucket_count

  • 桶数组:存储链表头指针(开链法解决冲突)

  • 键值对存储:每个节点存储键值对和缓存的哈希值

    // 哈希表节点结构示意
    template <typename Key, typename Value>
    struct HashNode {
   
        Key key;
        Value value;
        HashNode* next;      // 链表指针
        size_t cached_hash;  // 缓存哈希值(优化性能)
    };

2. 动态扩容机制

当负载因子(元素数/桶数)超过max_load_factor时触发rehash:

  1. 创建新的更大的桶数组(通常翻倍)

  2. 重新计算所有元素的桶位置

  3. 转移节点到新桶(避免深拷贝)


三、核心操作详解

1. 容器初始化与配置

    // 默认初始化
    unordered_map<string, int> wordCount;

    // 自定义哈希和相等比较
    struct CaseInsensitiveHash {
   
        size_t operator()(const string& s) const {
   
            size_t h = 0;
            for (char c : s) h += tolower(c);
            return h;
        }
    };

    unordered_map<string, int, CaseInsensitiveHash> caseInsensitiveMap;

    // 设置性能参数
    wordCount.max_load_factor(0.75);  // 负载阈值
    wordCount.reserve(1000);          // 预分配桶空间

2. 元素插入与更新

    // 插入新元素(键不存在时)
    auto [iter1, inserted] = wordCount.insert({
   "apple", 1});

    // 插入或更新(C++17推荐方式)
    wordCount["banana"] = 5;  // 直接访问(危险!可能意外插入)
    wordCount.at("orange") = 3;  // 安全访问(键必须存在)

    // 高效原地构造
    wordCount.emplace("cherry", 8);  // 避免临时对象

    // 多重映射允许重复键
    unordered_multimap<string, string> synonyms;
    synonyms.emplace("fast", "rapid");
    synonyms.emplace("fast", "quick");

3. 元素访问与查找

    // 安全查找模式
    if (auto it = wordCount.find("apple"); it != wordCount.end()) {
   
        cout << "Count: " << it->second << endl;
    }

    // 统计键出现次数(multimap特有)
    cout << synonyms.count("fast");  // 输出2

    // 范围查找重复键(multimap)
    auto [begin, end] = synonyms.equal_range("fast");
    for (; begin != end; 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/968449.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt 控件整理 —— 按钮类

一、PushButton 1. 介绍 在Qt中最常见的就是按钮&#xff0c;它的继承关系如下&#xff1a; 2. 常用属性 3. 例子 我们之前写过一个例子&#xff0c;根据上下左右的按钮去操控一个按钮&#xff0c;当时只是做了一些比较粗糙的去演示信号和槽是这么连接的&#xff0c;这次我们…

python-leetcode 27.合并两个有序链表

题目&#xff1a; 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 方法一&#xff1a;递归 函数在运行时调用自己&#xff0c;这个函数叫递归函数…

Unity中实现动态图集算法

在 Unity 中&#xff0c;动态图集&#xff08;Dynamic Atlas&#xff09;是一种在运行时将多个纹理合并成一个大纹理图集的技术&#xff0c;这样可以减少渲染时的纹理切换次数&#xff0c;提高渲染效率。 实现原理&#xff1a; 动态图集的核心思想是在运行时动态地将多个小纹理…

公然上线传销项目,Web3 的底线已经被无限突破

作者&#xff1a;Techub 热点速递 撰文&#xff1a;Yangz&#xff0c;Techub News 今天早些时候&#xff0c;OKX 将上线 PI 的消息在圈内引起轩然大波&#xff0c;对于上线被板上钉钉为传销盘子的「项目」 &#xff0c;Techub News 联系了 OKX 公关&#xff0c;但对方拒绝置评…

元宵节快乐

早上吃的一碗小颗粒汤圆。 晚上做了三个小菜&#xff0c;一碗米饭和一杯饮料。 整理了Chrome浏览器收藏夹书签&#xff0c;删除了太多不需要的书签&#xff0c;重新分类&#xff0c;更加细化。 看到某博主推荐的5本书&#xff0c;下载这学期看看。点击此处下载 看来这段关系…

SAP系统常见的接口方式及特点介绍

【SAP系统研究】 在SAP系统中,接口主要用于系统间或系统与外部应用的数据交换和集成。以下是常见的接口方式及其特点: 一、IDoc方式 IDoc,Intermediate document,是SAP历史很悠久的接口技术,是一种系统间通用的数据交换媒介文件。IDoc基于XML的标准格式,常用于EDI、系…

【嵌入式Linux应用开发基础】open函数与close函数

目录 一、open函数 1.1. 函数原型 1.2 参数说明 1.3 返回值 1.4. 示例代码 二、close函数 2.1. 函数原型 2.2. 示例代码 三、关键注意事项 3.1. 资源管理与泄漏防范 3.2. 错误处理的严谨性 3.3. 标志&#xff08;flags&#xff09;与权限&#xff08;mode&#xff…

LabVIEW国内外开发的区别

LabVIEW作为全球领先的图形化编程平台&#xff0c;在国内外工业测控领域均占据重要地位。本文从开发理念、技术生态、应用深度及自主可控性四个维度&#xff0c;对比分析国内外LabVIEW开发的差异&#xff0c;并结合国内实际应用场景&#xff0c;探讨其未来发展趋势。 ​ 一、开…

【大模型】阿里云百炼平台对接DeepSeek-R1大模型使用详解

目录 一、前言 二、DeepSeek简介 2.1 DeepSeek 是什么 2.2 DeepSeek R1特点 2.2.1 DeepSeek-R1创新点 2.3 DeepSeek R1应用场景 2.4 与其他大模型对比 三、阿里云百炼大平台介绍 3.1 阿里云百炼大平台是什么 3.2 阿里云百炼平台主要功能 3.2.1 应用场景 3.3 为什么选…

【DuodooBMS】给PDF附件加“受控”水印的完整Python实现

给PDF附件加“受控”水印的完整Python实现 功能需求 在实际工作中&#xff0c;许多文件需要添加水印以标识其状态&#xff0c;例如“受控”“机密”等。对于PDF文件&#xff0c;添加水印不仅可以增强文件的可识别性&#xff0c;还可以防止未经授权的使用。本代码的功能需求是…

linux的三剑客和进程处理

Linux三剑客&#xff1a; grep&#xff1a;查找 sed&#xff1a;编辑 awk&#xff1a;分析 grep - 正则表达式 [rootlocalhost ~]# grep ^a hello.txt abc grep - 忽略大小写&#xff0c;还有一些场景需要查询出来对应字符串所在的行号&#xff0c;方便我们快速在文件中定位字…

ASUS/华硕飞行堡垒9 FX506H FX706H 原厂Win10系统 工厂文件 带ASUS Recovery恢复

华硕工厂文件恢复系统 &#xff0c;安装结束后带隐藏分区&#xff0c;带一键恢复&#xff0c;以及机器所有的驱动和软件。 支持型号&#xff1a;FX506HC, FX506HE, FX506HM, FX706HC, FX706HE, FX706HM, FX506HHR, FX706HMB, FX706HEB, FX706HCB, FX506HMB, FX506HEB, FX506HC…

13.StringTable

String的基本特性 String&#xff1a;字符串&#xff0c;使用一对 ”” 引起来表示 String s1 "mogublog" ; // 字面量的定义方式String s2 new String("moxi"); string声明为final的&#xff0c;不可被继承String实现了Serializable接口&#xff1a;表…

JavaSE基本知识补充 -Map集合

目录 Map(key&#xff0c;value键值对呈现&#xff09; 1.1 Map的映射的特点 1. 2.HashMap &#xff08;键值对的业务偏多&#xff0c;而且hashmap在jdk1.7和1.8之间有所不同&#xff0c;性能做了提升&#xff0c;面试高频考点&#xff09; 1.3 Map接口的方法 方法 HashMap遍…

JAVA学习第二天

ArryList的构造方法和添加方法 01。构造方法的<>里面可以放数据类型 02. add&#xff08;&#xff09;可以直接在后面加入数据&#xff0c;也可以指定下标的插入元素。 ArrayList的常用方法 ArrayList存储对象 在Java中&#xff0c;System.out.println()可以打印基本数据…

基于窄带物联网的矿车追踪定位系统(论文+源码+实物)

1.功能设计 鉴于智能物联网的大趋势&#xff0c;本次基于窄带物联网的矿车追踪定位系统应具备以下功能&#xff1a; &#xff08;1&#xff09;实现实时定位&#xff0c;真正实现矿车随时随地定位; &#xff08;2&#xff09;定位精度高&#xff0c;采用该系统可以实现矿车在…

如何把邮件批量导出到本地

最近遇到邮箱满了的问题&#xff0c;需要把邮件批量导出到本地&#xff0c;然后清空邮箱。 问题是这个邮箱的官网&#xff0c;没有批量导出按钮&#xff0c;比较麻烦&#xff1b;总不能一封一封下载到本地&#xff0c;上万的。 找到了一个好用的工具&#xff0c;Mozilla Thun…

ICLR 2025 oral|用nuPlan + 200h物流小车数据集测试!SOTA扩散模型轨迹规划器来了

导读&#xff1a; 本文介绍了清华大学联合毫末智行、自动化所、港中文、上海交大、上海人工智能实验室最新研究成果《Diffusion-based Planning for Autonomous Driving with Flexible Guidance》——荣获ICLR 2025 Oral Presentation(仅1.8%接受率)。 该算法创新性地设计了基…

dify.ai 怎么配置链接火山引擎等云厂商的deepseek模型

要将 dify.ai 配置链接到火山引擎等云厂商的 DeepSeek 模型. 申请火山引擎的key&#xff0c;创建endpoint 添加模型 测试模型

SAP-ABAP:dialog界面中的数据块Event Block详解举例

在SAP的Dialog程序开发中&#xff0c;Event Block&#xff08;事件块&#xff09;是屏幕流逻辑&#xff08;Flow Logic&#xff09;中的关键部分&#xff0c;用于定义屏幕在特定事件触发时执行的逻辑。Event Block通常与ABAP模块&#xff08;Module&#xff09;结合使用&#x…