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

相关推荐

对LSTM中每个batch都初始化隐含层的理解

不知道有没有人和我有一样疑惑 在LSTM相关的代码中,为什么每个batch都会将隐藏层重新初始化, 这样不会把以前训练出来的参数丢掉吗?? 比如 代码来自GitHub 看了一些解释是h与c是状态,不是参数,每个batch中都需要初始化为0,LSTM 中的参数是W,b。 网络中训练的是参数,不是状态。 说真的。。。当时我没怎么看懂。。。 咨询了实验室的师兄后,我有了自己的理解 产生误解的主要原因是我对RNN和LSTM的结构理解不深入,我们通常看到RNN结构图基本都是这样的 ...

Chauncey_Wang的博客 5910

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

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

LF__plus的博客 1057

stm32驱动NRF24L01_原理+代码解析

NRF24L01是NORDIC公司生产的一款无线通信通信芯片,采用FSK 调制,集成NORDIC自家的Enhanced Short Burst协议。可以实现点对点或是1对6的无线通信。无线通信速度最高可达到2Mbps。①2.4G全球开放的ISM频段,免许可证使用。②最高工作速率2Mbps,高校的GFSK调制,抗干扰能力强。③126个可选的频道,满足多点通信和调频通信的需要。④内置CRC检错和点对多点的通信地址控制。⑤可设置自动应答,确保数据可靠传输。//NRF24L01寄存器操作命令。

zyc18700766982的博客 2万+

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

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

算法改变人生 6万+

神领物流-day01-项目概述

公司从2019年开始业务快速扩张,网点数量从138家扩展至540家,车辆从170台增长到800台。同时,原有的系统非常简单,比如车辆的调度靠人工操作、所有的货物分拣依靠人员,核心订单数据手动录入,人效非常低。随着业务不断演进,技术的不断提升,原有运输管理系统已无法满足现有快速扩展下的业务需求,但针对现有系统评估后发现,系统升级成本远高于重新研发。因此,公司决定基于现有业务体系进行重新构建,打造一套新的TMS运输系统,直接更替原有系统。

心飞为你飞 2255

利用随机矩阵理论(random matrix theory)确定微生物网络构建阈值

利用随机矩阵理论(random matrix theory)确定微生物网络构建阈值

微生物生态学分析 7638

C++中STL容器总结

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

EricLee23 2363

5个实战必备的多模态情感分析数据集(附下载链接与避坑指南)

本文精选了5个实战必备的多模态情感分析数据集,包括CMU-MOSEI、CH-SIMS、UR-FUNNY、MUStARD和IEMOCAP,并提供了详细的下载链接与避坑指南。文章重点介绍了如何高效获取、预处理这些数据集,并自然整合了多模态情感分析的核心热词,旨在帮助研究者和开发者快速启动项目,规避常见陷阱,聚焦模型创新。

yolo5detector的博客 280

【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

大疆视觉算法面试,手推极线几何这关刷掉了一半人

摘要:大疆机器视觉算法工程师面试重点考察目标检测工程优化、深度估计几何原理和视觉SLAM全流程。目标检测侧重模型压缩和部署优化,需掌握知识蒸馏、量化及算子融合;深度估计要求推导双目几何并理解单目深度恢复方法;视觉SLAM需熟悉前后端流程及ORB-SLAM3/VINS-Mono区别。面试常要求手推PnP等公式,注重实践能力。准备需重点练习公式推导和代码实现,掌握工程落地细节。

郑伟强dev的专栏 193

rk3576 点亮 LCD(mipi)

瑞芯微 RK3576 是一款面向中高端 AIoT 市场的 SoC,其 MIPI DSI (Display Serial Interface) 接口在性能和灵活性上相比前代(如 RK3399/RK3568)有显著提升,特别是在物理层协议的支持上更加现代化。相比RK3399 RK3568的mipi 接口少了 8lane,但是RK3576 MIPI DSI 增加更低功耗的 C-PHY。

weixin_35723192的博客 364

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

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

LF__plus的博客 1620

C# WinForms 多语种切换实现:打造国际化应用程序

合理实现多语种切换功能可以显著提升应用程序的国际化水平。模块化设计:将本地化逻辑模块化,便于管理和维护。异常处理:始终捕获和处理可能的异常,确保程序的健壮性。资源管理:合理管理资源文件,避免重复和遗漏。测试:在不同语言环境下进行全面测试,确保所有字符串都能正确显示。文档和注释:为关键代码添加详细的文档和注释,便于后续维护。

墨夶的博客 1691

【C++】STL容器

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

weixin_40514381的博客 1218

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

余额充值