C++ 入门第 21 天:STL 容器之无序映射与无序多重映射

C++STL容器内容总结 C++ STL容器使用,原理剖析总结 目录 如果需要录屏资料,请私信邮箱shitou3000@qq.com获取。 ... 阅读详情

往期回顾:

C++ 入门18:STL 容器之栈(stack)与队列(queue)-优快云博客

C++ 入门19:STL 容器之优先队列(priority_queue)-优快云博客

C++ 入门第 20 天:STL 容器之无序集合与无序多重集合-优快云博客


 C++ 入门第 21 天:STL 容器之无序映射与无序多重映射

一、前言

在前一节中,我们学习了无序集合(unordered_set)及其变种。在实际开发中,除了存储单个元素外,我们常常需要存储键值对(key-value)数据。例如,通过一个键快速找到对应的值。在 C++ 中,unordered_map 和 unordered_multimap 便是专门用于处理无序键值对的容器。

这两个容器基于哈希表实现,能够以平均 O(1)O(1)O(1) 的时间完成插入、删除和查找操作。

1. 无序映射(unordered_map)

unordered_map 是一个 无序关联容器,用于存储唯一键值对(key-value)。它的特点包括:

  1. 底层实现:基于哈希表,效率高。
  2. 键的唯一性:键(key)必须唯一。
  3. 无序存储:键值对的存储顺序与插入顺序无关。

1.1 常用操作

以下是 unordered_map 的常用操作:

成员函数功能说明
insert(pair<key, value>)插入键值对
erase(key)删除指定键对应的键值对
find(key)查找键,返回对应迭代器
operator[]通过键访问值(若不存在会自动插入)
size()获取键值对的数量
empty()检查容器是否为空

示例代码:基本操作

#include <iostream>
#include <unordered_map>
using namespace std;

int main() {
    // 定义一个无序映射
    unordered_map<string, int> umap;

    // 插入键值对
    umap.insert({"Alice", 25});
    umap.insert({"Bob", 30});
    umap["Charlie"] = 20; // 使用[]操作符插入

    // 遍历容器
    cout << "Contents of unordered_map:" << endl;
    for (const auto& pair : umap) {
        cout << pair.first << ": " << pair.second << endl;
    }

    // 查找键
    if (umap.find("Alice") != umap.end()) {
        cout << "Alice's age: " << umap["Alice"] << endl;
    }

    // 删除键
    umap.erase("Bob");
    cout << "After removing Bob:" << endl;
    for (const auto& pair : umap) {
        cout << pair.first << ": " << pair.second << endl;
    }

    return 0;
}

输出结果(顺序可能不同):

Contents of unordered_map:
Charlie: 20
Alice: 25
Bob: 30
Alice's age: 25
After removing Bob:
Charlie: 20
Alice: 25

1.2 注意事项

  1. 自动插入行为:如果通过 [] 访问不存在的键,会自动插入该键,值初始化为默认值(如 int 为 0)。
  2. 哈希冲突处理:unordered_map 使用开放地址法或链地址法解决冲突。
  3. 重新哈希(rehash):当装载因子过高时,会重新分配存储桶,导致性能下降。

2. 无序多重映射(unordered_multimap)

unordered_multimap 与 unordered_map 类似,但允许键重复。

2.1 常用操作

成员函数功能说明
insert(pair<key, value>)插入键值对
equal_range(key)返回与某键相关的所有键值对的范围
count(key)返回某键出现的次数

示例代码:无序多重映射

#include <iostream>
#include <unordered_map>
using namespace std;

int main() {
    // 定义一个无序多重映射
    unordered_multimap<string, int> ummap;

    // 插入键值对
    ummap.insert({"Alice", 25});
    ummap.insert({"Bob", 30});
    ummap.insert({"Alice", 35}); // 允许重复键

    // 遍历容器
    cout << "Contents of unordered_multimap:" << endl;
    for (const auto& pair : ummap) {
        cout << pair.first << ": " << pair.second << endl;
    }

    // 查找某键的所有值
    auto range = ummap.equal_range("Alice");
    cout << "Values associated with Alice:" << endl;
    for (auto it = range.first; it != range.second; ++it) {
        cout << it->second << " ";
    }
    cout << endl;

    return 0;
}

输出结果(顺序可能不同):

Contents of unordered_multimap:
Alice: 25
Bob: 30
Alice: 35
Values associated with Alice:
25 35

3. unordered_map 和 unordered_multimap 的性能分析

优点

  1. 高效操作:基于哈希表,插入、删除和查找操作的平均时间复杂度为 O(1)O(1)O(1)。
  2. 灵活性强:支持键值对存储,方便快速检索和更新数据。

缺点

  1. 无序存储:键值对的顺序与插入顺序无关,适合只关心内容的场景。
  2. 哈希冲突:在哈希函数不理想或装载因子过高时,性能可能下降。
  3. 占用内存多:哈希表存储需要额外的内存开销。

4. 实际应用场景

  • 快速检索:通过键快速找到对应值,例如字典查询。
  • 频率统计:统计某些键的出现次数(可用 unordered_multimap)。
  • 缓存机制:用作缓存容器,通过键值快速检索数据。

示例:统计单词出现次数

题目描述

给定一段文本,统计每个单词出现的次数。

示例代码
#include <iostream>
#include <unordered_map>
#include <sstream>
#include <string>
using namespace std;

int main() {
    string text = "hello world hello C++ world";
    unordered_map<string, int> wordCount;

    // 将字符串分割为单词
    stringstream ss(text);
    string word;
    while (ss >> word) {
        wordCount[word]++;
    }

    // 输出每个单词的出现次数
    cout << "Word frequencies:" << endl;
    for (const auto& pair : wordCount) {
        cout << pair.first << ": " << pair.second << endl;
    }

    return 0;
}

输出结果:

Word frequencies:
hello: 2
world: 2
C++: 1

5. unordered_map 和 map 的对比 

特性unordered_mapmap
底层结构哈希表红黑树
是否有序无序有序
查找时间复杂度O(1)O(1)O(1)(平均情况)O(log⁡n)O(\log n)O(logn)
插入、删除时间复杂度O(1)O(1)O(1)(平均情况)O(log⁡n)O(\log n)O(logn)

结语

以上就是 C++ 标准模板库中的无序映射与无序多重映射的基础知识点了。这两种容器非常适合需要快速检索键值对数据的场景。理解它们的特性和使用方法,可以显著提升我们的代码效率。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

C++,STL容器,unordered_map/unordered_multimap:无序映射/无序多重映射深入解析 unordered_map和unordered_multimap是C++11引入的哈希关联容器,提供平均O(1)时间复杂度的键值对存储与访问能力。它们与map/multimap的核心区别在于不维护键的顺序,通过哈希表实现快速查找。 阅读详情

相关推荐

【保姆级教程/代码】GNSS反演大气可降水量(Precipitable Water Vapor, PWV)

GPS精密单点定位(PPP)是一种采用精密卫星星历和卫星钟差进行非差单点定位的方法,在观测过程中采用双频载波相位观测法以确保高精度定位精度。本文利用PPP技术来求解天顶对流层延迟(zenith tropospheric delay,ZTD)。ZTD由湿延迟(ZWD)和干延迟(ZHD)组成,其中占比90%的ZHD与地面测站高程、大气压和测站纬度等参数有良好的相关性,可以通过Saastamoinen模型精确求出;

weixin_43910227的博客 2925

C++ 入门第 20 天:STL 容器之无序集合与无序多重集合

C++ 入门第 20 天:STL 容器之无序集合与无序多重集合 一、前言 在之前的学习中,我们已经掌握了 set 和 multiset 容器,它们都是有序关联容器。但在某些场景下,我们并不关心元素的顺序,而是追求更高的性能。在这种情况下,C++ 提供了 无序容器,例如 unordered_set 和 unordered_multiset,它们的底层基于 哈希表(Hash Table) 实现,能够以常数时间完成插入、删除和查找操作。

LF__plus的博客 1057

【Collibra 驱动 IPD 数据血缘治理】:三层图谱分层展示体系与全链路追踪的技术业务实践

(应用级/数据级/字段级)是理解复杂数据流动的核心手段。其价值不仅体现在可视化的直观性,更在于通过。技术保障血缘不可篡改性,进一步提升IPD数据治理的可靠性。,解决了跨层级血缘分析的性能与可用性矛盾。数据血缘图谱要素定义(字节跳动/腾讯云/信安标委)实现对IPD数据的精准追踪,而数据血缘图谱的。分层交互设计标准(智慧城市数据中台规范)Collibra技术文档(2024)字段级血缘的挑战与解决路径。自动优化血缘路径,并深化。字段级血缘技术实现方案。Collibra通过。图数据库性能优化原理。

百态·数智思维 | 聚焦大数据、量化与未来AI 1244

C++ STL中容器的使用全面总结

一、容器的定义        在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种“对象”还包含了一系列处理“其它对象”的方法。 二、容器的种类   1、顺序容器:是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操

算法改变人生 6万+

4.7W防削顶单声道D类音频功率放大器HT6872介绍

HT6872是一款低EMI,防削顶失真,单声道免滤波D类音频功率放大器。在6.5V电源,10%THD+N,4Ω负载条件下,输出4.71W功率,在各类音频终端应用中维持高效率并提供AB类放大器的性能。

weichen_78的博客 4699

BEVFusion(mit)最强环境安装,部署复现

BEVFusion作为一项经典的工作,值得深入探索。然而由于配置环境比较麻烦,耽误了一些时间。经过几次成功配置之后,有了一些总结,在这里记录下来,供大家参考避坑,也方便自己下次查阅。

qq_45783225的博客 1万+

C++中STL容器总结

STL容器1、容器分类 1、容器分类 STL中通常将容器分为三类:顺序容器、关联容器和容器适配器。 1、顺序容器 是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。 顺序容器包括: vector(向量)、list(列表)、deque(队列)...

EricLee23 2363

【学习系列】SAP RAP 4:通过注解来完成一些常规需求

本文介绍了RAP应用中常用注解的实现方式,包括搜索帮助、文本描述绑定、联动搜索、字段控制等功能。通过@Consumption、@UI等注解可以实现搜索帮助定义、多字段联动、必输校验、默认排序和默认值设置。管理字段可通过@Semantics注解自动记录创建/修改信息,长文本使用@UI.multiLineText实现多行显示。这些注解可优化界面交互和数据管理,为后续行为定义功能开发奠定基础。文章结构清晰,针对不同需求提供了具体的实现方案和代码示例。

DeveloperMrMeng的博客 697

【C++】STL 容器总结 ( STL 各容器特点 | STL 个容器使用场景 | 单端数组容器 | 双端队列容器 | 双向链表容器 | 集合容器 | 多重集合容器 | 映射容器 | 多重映射容器 )

一、STL 各容器特点 1、std::vector 单端数组容器 2、std::deque 双端队列容器 3、std::list 双向链表容器 4、std::set 集合容器 5、std::multiset 多重集合容器 6、std::map 映射容器 7、std::multimap 多重映射容器 二、STL 各容器特点总结 三、STL 各容器使用场景示例

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 6693

内存泄漏系列专题分析之二十一:高通相机CamX内存泄漏&内存占用分析--GPU内存拆解

通过上述debug方式,可以看到patch补丁可以顺利debug各种ION内存分布,可以通过它分析ION内存占用问题。同时我们还可以分析GPU内存泄漏问题,同样的方式可以看到所有的GPU内存分布,如果某个GPU内存持续增长,就极有可能内存泄漏,然后更具堆栈信息去分析代码,并解决GPU内存泄漏问题。!!

453

【温室气体】GOSAT 数据产品

【温室气体】GOSAT 数据产品

WW、forever的博客 238

C++ 入门17:STL 容器之映射(map)与多重映射(multimap)

在前面文章的学习中,我们学习了 STL 中的 vector、list 等容器。这些容器主要用于存储线性数据,但有时候我们需要存储键值对(key-value pair),这种场景下就需要使用映射(map)容器。今天我们将学习 C++ 标准模板库(STL)中的 map 和 multimap,它们都可以用来存储键值对,记住最重要的区别:map 不允许键重复,而 multimap 允许键重复。

LF__plus的博客 1620

LeRobot 入门教程(十)LIBERO 机器人终身学习评估

LIBERO是一项专注于机器人终身学习(LLDM)的基准测试平台,包含130项任务,分为5大套件(空间推理、物体操作、目标约束等)。LeRobot框架已集成LIBERO,支持单/多套件评估,并兼容SmolVLA模型。训练需使用预处理数据集(HuggingFaceVLA/libero),观测数据需符合规范(8维状态+双摄像头图像)。该平台采用MuJoCo模拟,支持无头服务器运行,旨在推动机器人持续学习算法的发展与标准化评估。

2506_90492529的博客 1663

【C++】STL容器

c++ stl容器学习,详细介绍顺序容器、关联容器以及容器适配器等

weixin_40514381的博客 1218

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++ STL标准库:关联容器 无序集合unordered_map(C++ 11)

文章目录1. 简介2. 基本使用3. 迭代器使用 unordered_map - C++ Reference (cplusplus.com) 1. 简介 unordered_map(无序映射)是一种储存键值(key-value)对, key是唯一的、无序的 关联容器。 unordered_set内部结构采用 哈希表(哈希桶算法)实现,可以通过键高效访问各个元素(平均时间复杂度恒定)。 2. 基本使用 #include<iostream> #include<unordered_map

超级大洋葱的博客 1206

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C++ STL标准库:关联容器 无序集合unordered_set(C++ 11)

文章目录1. 简介2. 基本使用3. 迭代器使用 unordered_set - C++ Reference (cplusplus.com) 1. 简介 unordered_set(无序集合)是一种每个元素值都是 唯一的、无序的 关联容器。 unordered_set内部结构采用 哈希表(哈希桶算法)实现,可以通过键高效访问各个元素(平均时间复杂度恒定)。 2. 基本使用 #include<iostream> #include<unordered_set> using nam

超级大洋葱的博客 3235

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++STL标准库中的常用容器总结

C++ STL(标准模板库)提供了多种容器类型及其对应的迭代器,用于实现高效的数据操作。迭代器分为五种类型(随机访问、双向、前向、输出和输入迭代器),不同容器支持不同类型的迭代器。容器主要包括四大类:序列容器(array、vector、deque)、链表容器(forward_list、list)、容器适配器(stack、queue、priority_queue)和关联容器(有序/无序的set/map系列)。

SeeDoubleU的专栏 5376

C++ STL容器与QT容器理解

STL容器与QT容器分析

Mason___的博客 1237

【C++100问】深度总结STL基本容器的使用

专栏C++学习笔记 声明 1)本文仅供学术交流,非商用。 2)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。 3)此属于第一版本,若有错误,还需继续修正与增删,还望大家多多指点。 4)大家都共享一点点,一起为祖国科研的推进添砖加瓦。 文章目录专栏C++学习笔记声明〇、前言一、C++库引用(Import C++ Library)二、STL(Standard Template Libra...

种树最好的时间是10年前,其次是现在!!! 7061

C++中STL之容器和迭代器

各种数据结构,如Vector,List,Deque,Set,Map,用来存放数据,STL容器是一种Class Template,就体积而言,这一部分很像冰山载海面的比率。扮演容器与算法之间的胶合剂,是所谓的“泛型指针”,共有五种类型,以及其它衍生变化,从实现的角度来看,迭代器是一种将:Operators*,Operator->,Operator++,Operator--等相关操作予以重载的ClassTemplate(模板类)。所有STL容器都附带有自己专属的迭代器。

weixin_50615869的博客 2281

C++ STL标准库:关联容器 多重映射multimap

文章目录1. 简介2. 使用 multimap - C++ Reference (cplusplus.com) 1. 简介 multimap(多重映射)是一种存储键值(key-vauekey是 允许重复的、有序的 关联容器。 multimap内部结构采用红黑树(Red-Black tree)的平衡叉树,它可以在O(log n)时间内高效的做查找,插入和删除。 2. 使用 #include<map> #include<iostream> using namespace std;

超级大洋葱的博客 1318

C++容器之多重映射(std::multimap)

多重映射是关联容器,用于存储由键值和映射值的组合形成的元素,遵循特定顺序,并且其中多个元素可以具有等效键。

flysnow010的博客 1142

C++之STL容器学习总结

文章目录1.STL容器简介1.1STL介绍1.2容器分类2.向量vector2.1定义和初始化2.2常用操作2.3遍历操作3.列表list3.1定义和初始化3.2常用操作3.3遍历操作3.4实例程序4.双端队列deque4.1定义和初始化4.2常用操作4.3实例操作5.集合set5.1定义和初始化5.3常用操作5.4遍历操作5.5实例操作 1.STL容器简介 1.1STL介绍 STL是什么?STL...

蒋成的博客 4117

48 C++ STL模板库17-容器9-关联容器-映射(map)多重映射(multimap)

本文介绍了STL中的关联容器map和multimap,它们以键值对形式存储元素,底层基于红黑树实现,保证元素有序排列。map的键唯一,而multimap允许重复键。文章详细说明了它们的构造函数、赋值操作及迭代器使用方法,包括正向/反向遍历、常量迭代器等。此外,还介绍了自定义比较器、性能优化技巧及迭代器失效问题。这些容器适用于需要快速查找和动态管理键值对数据的场景。

17208955的博客 1012

c++ STL 之多重映射与多重集—— multiset 与 multiset 详解

multiset 与 multiset是stl的两个关联容器,名叫“多重映射”和“多重集”,何为“多重映射”和“多重集”?其实就是一个数组,但有了数组何必还需“多重映射”和“多重集”

zhhg0123的博客 1830

【C++】一文速通STL六大组件之容器

STL容器【保姆式教学】,主要针对STL中容器版块的详细教学。 STL的容器种类分为顺序性容器、关联式容器和容器适配器 vector(向量)、deque(双端队列)、list(双向循环链表)、stack(堆栈)、map(映射)

做技术人 · 产优质博客 · 找好工作 2937
上一篇: C++ 入门第 20 天:STL 容器之无序集合与无序多重集合
下一篇: C++经典面试题50道!!!(秋招必备)
从一的
博客等级 码龄5年 1995粉丝 213原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值