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

C++ 学习杂记06:std::unordered_map

概述std::unordered_map是C标准模板库STL中的一个关联容器实现基于哈希表的键值对映射。自C11起成为标准库的一部分位于unordered_map头文件中。核心特性数据结构基于哈希表使用散列函数将键映射到存储桶bucket无序存储元素不以特定顺序存储遍历顺序不确定唯一键每个键在容器中只能出现一次平均常数时间复杂度插入、删除、查找操作平均O(1)最坏情况O(n)模板声明template class Key, class T, class Hash std::hashKey, class KeyEqual std::equal_toKey, class Allocator std::allocatorstd::pairconst Key, T class unordered_map;基本操作1. 构造与初始化// 默认构造 std::unordered_mapstd::string, int map1; // 初始化列表构造 std::unordered_mapstd::string, int map2 { {apple, 1}, {banana, 2}, {orange, 3} }; // 范围构造 std::vectorstd::pairstd::string, int vec {{a, 1}, {b, 2}}; std::unordered_mapstd::string, int map3(vec.begin(), vec.end()); // 拷贝构造 std::unordered_mapstd::string, int map4(map2);2. 元素访问// operator[] - 访问或插入键不存在时插入默认值 int value map[apple]; // 如果不存在会插入{apple, 0} map[apple] 10; // 修改或插入 // at() - 边界检查访问 try { int val map.at(apple); // 存在则返回 } catch (const std::out_of_range e) { // 键不存在时抛出异常 } // find() - 安全查找 auto it map.find(apple); if (it ! map.end()) { // 找到元素it-first是键it-second是值 }3. 修改操作// 插入元素 auto result map.insert({apple, 1}); // 返回pairiterator, bool map.emplace(banana, 2); // 原地构造更高效 // 插入或赋值 (C17) map.insert_or_assign(apple, 3); // 存在则赋值不存在则插入 // 删除元素 map.erase(apple); // 按键删除 auto it map.find(banana); if (it ! map.end()) { map.erase(it); // 按迭代器删除 } map.erase(map.begin(), map.end()); // 范围删除 // 清空 map.clear();4. 容量查询bool empty map.empty(); // 是否为空 size_t size map.size(); // 元素数量 size_t max map.max_size(); // 理论最大容量哈希表特定操作1. 桶接口// 桶数量相关 size_t bucket_count map.bucket_count(); // 桶总数 size_t bucket_idx map.bucket(apple); // 键所在的桶索引 // 桶信息 size_t bucket_size map.bucket_size(0); // 指定桶中的元素数 // 负载因子 float load_factor map.load_factor(); // 平均每个桶的元素数 float max_lf map.max_load_factor(); // 最大负载因子 map.max_load_factor(0.75f); // 设置最大负载因子2. 哈希策略// 调整桶数量 map.rehash(100); // 确保至少有100个桶 map.reserve(1000); // 确保能容纳1000个元素而不超过最大负载因子迭代器类型// 迭代器类型 std::unordered_mapstd::string, int::iterator it; std::unordered_mapstd::string, int::const_iterator cit; std::unordered_mapstd::string, int::local_iterator lit; // 桶内迭代器遍历方式// 1. 基于范围的for循环 (C11) for (const auto [key, value] : map) { // C17结构化绑定 // 使用key和value } // 2. 迭代器遍历 for (auto it map.begin(); it ! map.end(); it) { const auto key it-first; const auto value it-second; } // 3. 遍历所有桶 for (size_t i 0; i map.bucket_count(); i) { for (auto lit map.begin(i); lit ! map.end(i); lit) { // 遍历第i个桶 } }自定义类型作为键1. 定义哈希函数struct Person { std::string name; int age; bool operator(const Person other) const { return name other.name age other.age; } }; // 自定义哈希函数 struct PersonHash { size_t operator()(const Person p) const { return std::hashstd::string()(p.name) ^ (std::hashint()(p.age) 1); } }; // 使用自定义哈希 std::unordered_mapPerson, std::string, PersonHash person_map;2. 使用标准库组合哈希 (C14)#include functional struct PersonHash { size_t operator()(const Person p) const { return std::hashstd::string{}(p.name) ^ (std::hashint{}(p.age) 1); } };性能特性时间复杂度操作平均情况最坏情况插入O(1)O(n)删除O(1)O(n)查找O(1)O(n)遍历O(n)O(n)空间复杂度需要额外的空间存储桶数组和链表指针通常比std::map占用更多内存与std::map对比特性std::unordered_mapstd::map底层结构哈希表红黑树顺序无序按键排序操作复杂度平均O(1)O(log n)内存使用通常更高通常更低迭代器稳定性插入可能使所有迭代器失效除删除元素外迭代器稳定自定义键要求需要哈希函数需要比较函数最佳实践1. 预分配空间std::unordered_mapint, std::string map; map.reserve(1000); // 预分配避免多次rehash2. 选择合适的哈希函数对于整数类型标准哈希通常足够对于字符串考虑使用更好的分布避免哈希冲突过多3. 查找优化// 避免重复查找 auto it map.find(key); if (it ! map.end()) { // 使用it-second } else { // 键不存在 } // 而不是 if (map.count(key) 0) { // 额外查找 int value map[key]; // 再次查找 }4. 遍历时修改// 安全删除遍历中的元素 for (auto it map.begin(); it ! map.end(); ) { if (condition) { it map.erase(it); // erase返回下一个有效迭代器 } else { it; } }线程安全性多个线程可以同时读取容器如果有任何线程修改容器所有线程访问都需要同步使用std::shared_mutexC17或互斥锁保护并发访问特殊成员函数 (C17)1.extract()- 节点句柄// 提取节点而不重新分配内存 auto nh map.extract(apple); if (!nh.empty()) { nh.key() new_apple; // 修改键 map.insert(std::move(nh)); // 重新插入 }2.merge()- 合并容器std::unordered_mapstd::string, int map1, map2; // ... 填充数据 map1.merge(map2); // 尝试合并所有元素常见问题与解决方案1. 哈希冲突过多调整负载因子使用更好的哈希函数增加桶数量2. 自定义键的哈希质量差确保哈希函数分布均匀考虑使用现成的哈希组合库3. 迭代器失效插入操作可能使所有迭代器失效删除操作只使指向被删元素的迭代器失效总结std::unordered_map提供了高效的键值对存储适合需要快速查找而不关心顺序的场景。正确使用时其性能通常优于基于树的std::map。使用时需注意内存使用、哈希函数质量和线程安全性。

相关文章:

C++ 学习杂记06:std::unordered_map

概述std::unordered_map是C标准模板库&#xff08;STL&#xff09;中的一个关联容器&#xff0c;实现基于哈希表的键值对映射。自C11起成为标准库的一部分&#xff0c;位于 <unordered_map>头文件中。核心特性数据结构基于哈希表&#xff1a;使用散列函数将键映射到存储桶…...

玩转 InternVL3.5 轻量级实战:从部署到优化的全记录

目录 InternVL3.5 1b部署到优化 环境依赖项: torch版本; 推理代码封装 结果: InternVL3.5 1b部署到优化 环境依赖项: pip install transformers==4.56.0pip install --upgrade timm --no-depstorch版本; 2.7.0 cuda 2.6.0 cuda 推理代码封装 from...

YuukiPS启动器:终极免费动漫游戏一键启动解决方案

YuukiPS启动器&#xff1a;终极免费动漫游戏一键启动解决方案 【免费下载链接】Launcher-PC 项目地址: https://gitcode.com/gh_mirrors/la/Launcher-PC 还在为复杂的游戏配置和繁琐的补丁更新而烦恼吗&#xff1f;YuukiPS启动器正是为你量身定制的终极解决方案&#x…...

终极VLC播放器个性化改造:如何用VeLoCity皮肤打造专业级媒体体验

终极VLC播放器个性化改造&#xff1a;如何用VeLoCity皮肤打造专业级媒体体验 【免费下载链接】VeLoCity-Skin-for-VLC Castom skin for VLC Player 项目地址: https://gitcode.com/gh_mirrors/ve/VeLoCity-Skin-for-VLC 还在忍受VLC播放器那千篇一律的默认界面吗&#x…...

从1.4GB到352MB:paraphrase-multilingual-MiniLM-L12-v2多语言语义匹配模型量化优化实战指南

从1.4GB到352MB&#xff1a;paraphrase-multilingual-MiniLM-L12-v2多语言语义匹配模型量化优化实战指南 【免费下载链接】paraphrase-multilingual-MiniLM-L12-v2 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/paraphrase-multilingual-MiniLM-L12-v2 你是…...

3大策略彻底解决ComfyUI-SUPIR内存访问冲突:从3221225477错误到稳定超分辨率工作流

3大策略彻底解决ComfyUI-SUPIR内存访问冲突&#xff1a;从3221225477错误到稳定超分辨率工作流 【免费下载链接】ComfyUI-SUPIR SUPIR upscaling wrapper for ComfyUI 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-SUPIR ComfyUI-SUPIR作为基于SDXL架构的图像超…...

录播姬BililiveRecorder:3个步骤掌握专业级B站直播录制与修复

录播姬BililiveRecorder&#xff1a;3个步骤掌握专业级B站直播录制与修复 【免费下载链接】BililiveRecorder 录播姬 | mikufans 生放送录制 项目地址: https://gitcode.com/gh_mirrors/bi/BililiveRecorder 录播姬BililiveRecorder是一款专为B站直播设计的开源录制工具…...

如何用Python自动化抓取闲鱼商品信息:终极爬虫解决方案

如何用Python自动化抓取闲鱼商品信息&#xff1a;终极爬虫解决方案 【免费下载链接】idlefish_xianyu_spider-crawler-sender 闲鱼自动抓取/筛选/发送系统&#xff0c;xianyu spider crawler blablabla 项目地址: https://gitcode.com/gh_mirrors/id/idlefish_xianyu_spider-…...

别再只会用默认配置了!手把手教你用AT指令玩转DX-BT04-A蓝牙模块

从零玩转DX-BT04-A蓝牙模块&#xff1a;AT指令实战进阶指南 刚拿到DX-BT04-A蓝牙模块时&#xff0c;许多开发者会直接使用默认配置快速验证基础功能。但当需要将模块集成到实际项目中时&#xff0c;默认参数往往无法满足需求——千篇一律的"DX-BT04-A"设备名称、简单…...

录播姬BililiveRecorder:如何构建高可靠性的直播录制与修复系统

录播姬BililiveRecorder&#xff1a;如何构建高可靠性的直播录制与修复系统 【免费下载链接】BililiveRecorder 录播姬 | mikufans 生放送录制 项目地址: https://gitcode.com/gh_mirrors/bi/BililiveRecorder 在直播内容创作日益普及的今天&#xff0c;稳定可靠的录制工…...

Hi3518ev200刷机避坑指南:uboot刷写常见错误及解决方案

Hi3518ev200刷机实战&#xff1a;uboot刷写全流程解析与深度排错 最近在折腾Hi3518ev200开发板时&#xff0c;发现不少同行在uboot刷写阶段频频踩坑。作为一款经典的嵌入式处理器&#xff0c;Hi3518ev200在安防摄像头、物联网终端等领域应用广泛&#xff0c;但官方文档对刷机流…...

SSD、YOLO、Faster R-CNN怎么选?一张图看懂三大目标检测算法的实战差异

SSD、YOLO、Faster R-CNN实战选型指南&#xff1a;从原理到落地的深度对比 当工程师面对工业质检流水线上毫秒级的检测需求&#xff0c;或是自动驾驶系统对复杂场景的实时响应挑战时&#xff0c;算法选型往往成为项目成败的关键分水岭。本文将带您穿透技术迷雾&#xff0c;从底…...

告别格式烦恼:华科本科毕业论文LaTeX模板的3步高效排版方案

告别格式烦恼&#xff1a;华科本科毕业论文LaTeX模板的3步高效排版方案 【免费下载链接】HUSTPaperTemp 华中科技大学本科毕业论文LaTeX模板 2017 项目地址: https://gitcode.com/gh_mirrors/hu/HUSTPaperTemp 还在为毕业论文格式调整而头疼吗&#xff1f;华中科技大学本…...

G-Helper华硕笔记本控制工具:如何实现轻量级性能管理与硬件优化

G-Helper华硕笔记本控制工具&#xff1a;如何实现轻量级性能管理与硬件优化 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, …...

ARIMA模型保存与加载问题解决方案

1. ARIMA模型保存与加载的完整指南在时间序列分析领域&#xff0c;ARIMA&#xff08;自回归积分滑动平均&#xff09;模型是最经典且广泛应用的预测工具之一。作为Python数据分析师&#xff0c;我们经常需要将训练好的模型保存下来供后续使用。然而在实际操作中&#xff0c;sta…...

RAG 检索查不准的根因与工程修复:从相似度阈值到文档切分的链路调优

RAG 检索查不准的根因与工程修复&#xff1a;从相似度阈值到文档切分的链路调优 背景&#xff1a;一次“知识在库里却答不出”的线上问题 某客服问答系统上线后&#xff0c;用户反馈&#xff1a;“明明文档里写了&#xff0c;但系统就是答不上来。” 初期排查发现&#xff0c;知…...

让AI主动做事,从建立身份认同开始

管理AI就像管理员工&#xff1a;下达命令会引来抵触&#xff0c;但一旦让它建立‘我就是这样的人’的身份认同&#xff0c;它便会主动遵循规则。你有没有过这种经历&#xff1f; 明明跟 AI 说好了要做什么&#xff0c;转头它就忘得一干二净&#xff1f; 你写了一堆规则&#xf…...

如何快速下载B站高清视频:BilibiliDown跨平台下载器完整指南

如何快速下载B站高清视频&#xff1a;BilibiliDown跨平台下载器完整指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mir…...

CyberChef完整指南:3种方法轻松掌握网络安全数据处理神器

CyberChef完整指南&#xff1a;3种方法轻松掌握网络安全数据处理神器 【免费下载链接】CyberChef The Cyber Swiss Army Knife - a web app for encryption, encoding, compression and data analysis 项目地址: https://gitcode.com/GitHub_Trending/cy/CyberChef Cybe…...

WaveDrom:用代码生成专业时序图的终极解决方案

WaveDrom&#xff1a;用代码生成专业时序图的终极解决方案 【免费下载链接】wavedrom :ocean: Digital timing diagram rendering engine 项目地址: https://gitcode.com/gh_mirrors/wa/wavedrom 在硬件设计、嵌入式开发和数字电路教学中&#xff0c;时序图的绘制一直是…...

保姆级教程:手把手教你为WK2124 SPI转485驱动添加GPIO收发控制(基于Linux内核)

Linux内核驱动实战&#xff1a;WK2124 SPI转485的GPIO收发控制全解析 在工业控制、智能家居和物联网设备开发中&#xff0c;RS-485总线因其抗干扰能力强、传输距离远等优势成为首选通信方案。而将SPI接口扩展为多路485接口时&#xff0c;WK2124这类专用芯片常被工程师选用。本文…...

用QT从零撸一个超级玛丽,我踩过的那些坑和4000行代码换来的经验

用QT从零实现超级玛丽&#xff1a;4000行代码背后的架构设计与实战复盘 第一次在QT中看到自己编写的马里奥角色成功跳跃过第一个蘑菇怪时&#xff0c;那种成就感至今难忘。作为C课程设计的挑战性项目&#xff0c;这个用纯QT框架实现的经典游戏不仅让我重新认识了跨平台GUI库的…...

Go 语言从入门到进阶 | 第 8 章:并发编程——Goroutine 与 Channel

系列:Go 语言从入门到进阶 作者:耿雨飞 适用版本:go v1.26.2 前置条件 在开始本章学习之前,请确保: 已完成前七章的学习,掌握函数、接口和泛型基础 理解函数作为一等公民的概念(闭包、函数类型) 已获取 Go 1.26.2 源码树(go-go1.26.2 目录) 导读 并发是 Go 语言最核…...

Qianfan-OCR惊艳效果:带水印/折痕/阴影扫描件经预处理后清晰还原

Qianfan-OCR惊艳效果&#xff1a;带水印/折痕/阴影扫描件经预处理后清晰还原 1. 效果展示&#xff1a;从模糊到清晰的蜕变 1.1 复杂文档的挑战 传统OCR技术在处理带水印、折痕或阴影的扫描件时常常束手无策。这些干扰因素会导致文字识别率大幅下降&#xff0c;特别是对于小字…...

解锁学术新境界:书匠策AI——你的毕业论文智能导航员

在学术的浩瀚海洋中&#xff0c;每一位即将扬帆远航的毕业生都面临着撰写毕业论文这一艰巨任务。它不仅是对所学知识的综合检验&#xff0c;更是开启未来学术或职业道路的一把钥匙。然而&#xff0c;面对堆积如山的文献、错综复杂的逻辑架构&#xff0c;以及那令人头疼的格式规…...

书匠策AI:期刊论文写作的“智慧导航仪”

在学术的浩瀚宇宙中&#xff0c;期刊论文是那璀璨的星辰&#xff0c;照亮着知识传承与创新的前行道路。对于每一位投身学术领域的人来说&#xff0c;撰写一篇高质量的期刊论文&#xff0c;是实现自我价值、推动学科发展的重要途径。然而&#xff0c;论文写作之路充满挑战&#…...

douyin-downloader:基于智能编排架构的抖音内容下载效率革命

douyin-downloader&#xff1a;基于智能编排架构的抖音内容下载效率革命 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback…...

终极指南:3步实现Electron asar文件的可视化管理,告别复杂命令行!

终极指南&#xff1a;3步实现Electron asar文件的可视化管理&#xff0c;告别复杂命令行&#xff01; 【免费下载链接】WinAsar Portable and lightweight GUI utility to pack and extract asar( Electron archive ) files, Only 551 KB! 项目地址: https://gitcode.com/gh_…...

探秘书匠策AI:开启期刊论文写作的“智慧宝藏”

在学术的浩瀚宇宙中&#xff0c;期刊论文是那璀璨的星辰&#xff0c;照亮着知识传承与创新的道路。对于每一位投身学术领域的人来说&#xff0c;撰写一篇高质量的期刊论文&#xff0c;就如同打造一件珍贵的艺术品&#xff0c;需要精心雕琢、反复打磨。然而&#xff0c;这一过程…...

OpenCore Legacy Patcher深度解析:如何让老旧Mac重获新生运行最新macOS

OpenCore Legacy Patcher深度解析&#xff1a;如何让老旧Mac重获新生运行最新macOS 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是…...