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的核心区别在于不维护键的顺序,通过哈希表实现快速查找。 阅读详情

相关推荐

炉石传说游戏系统拆解和部分系统分析

一.游戏综述 《炉石传说:魔兽英雄传》是一款由暴雪娱乐公司出品的策略类卡牌游戏。中国大陆地区的独家运营由网易公司代理。2014年3月13日全球同步正式运营。游戏背景设定于暴雪的魔兽系列,共十位魔兽中的角色作为十种不同的职业。而玩家要做的,就是根据己方现有的卡牌组建合适的卡组,指挥英雄,驱动随从,施展法术,与游戏好友或素不相识的对手一决高下。 二.游戏系统拆解图 三.游戏系统部分分析 1. 对战系统 (1)战斗准备 炉石传说开始前都需要配置至少30张卡牌作为出战卡组 .....

Jimmy72236的博客 4926

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

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

LF__plus的博客 1057

Silvaco Atlas(五)——物理模型总结

物理模型总结

qsz1425AWD2121的博客 2151

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

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

算法改变人生 6万+

51单片机独立按键控制LED(二)

对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。独立按键控制LED显示二进制。独立按键控制LED灯亮灭。独立按键控制LED状态。独立按键控制LED移位。

m0_50562428的博客 5381

Kubernetes集群资源优化实战:Volcano调度器如何帮你省下30%GPU算力

本文详细介绍了如何通过Volcano调度器的Binpack策略优化Kubernetes集群中的GPU资源利用率,解决AI模型训练中的资源碎片化问题。通过实战配置和调优指南,帮助用户提升30%的GPU算力利用率,显著降低任务等待时间和硬件成本。

weixin_30832143的博客 507

C++中STL容器总结

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

EricLee23 2363

目标检测数据集 第059期-基于yolo标注格式的水果李子检测数据集(含免费分享)

李子作为中国三大水果之一,种植历史超 3000 年,在市场中占据重要地位。传统李子种植、施肥、采摘依赖大量人力,存在资源浪费、产量估算不准、采摘时机难把控等问题。此前,农业领域缺乏针对 “未成熟李子” 的专用数据集,现有水果检测数据集多聚焦于成熟果实(如苹果、柑橘),且未覆盖李子种植的复杂自然场景。在使用该数据集进行学术研究时,应遵守相关的学术规范,引用该数据集的来源,尊重数据集创作者的劳动成果。,用于训练改进型模型,解决李子精准检测的核心痛点。

深度学习算法工程师,专注于前沿算法研究与实战应用。在这里,我将分享深度学习领域的实战经验、优质数据集资源以及最新论文解读与精度分析,旨在与广大技术爱好者共同探索人工智能的奥秘,助力技术成长与创新。 772

【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

基于MATLAB编程的LSTM的时间序列预测

时间序列预测,回归分析,LSTM详细原理

abc991835105的博客 360

23种设计模式-中介者(Mediator)设计模式

软考中级-软件设计师 中介者设计模式

片言可决讼,半纸能缚龙 1864

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

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

LF__plus的博客 1620

人工智能在文学领域的应用:创作无限可能的智能作家

人工智能在文学领域的应用:创作无限可能的智能作家 作者:禅与计算机程序设计艺术 1. 背景介绍 人工智能技术近年来飞速发展,在各个领域都有广泛应用。文学创作作为人类最高级的智力活动之一,也逐渐受到人工智能技术的影响和改变。随着自然语言处理、生成式模型等人工智能

AI天才研究院 1110

【C++】STL容器

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

weixin_40514381的博客 1218

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

STM32F407中文手册

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

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、付费专栏及课程。

余额充值