C++第十节:map和set的介绍与使用

 

【本节要点】

  • 1.关联式容器
  • 2.键值对
  • 3.map介绍与使用
  • 4.set介绍与使用
  • 5.multimap与multisedd的介绍与使用

一、关联式容器:数据管理的核心利器

关联式容器是STL中用于高效存储和检索键值对(key-value pair)的数据结构,其底层基于红黑树(Red-Black Tree)实现,具备以下特性:

  • 有序性:元素按**键(key)**自动排序(默认升序)。
  • 对数时间复杂度:插入、删除、查找操作均为 O(logN)
  • 键的唯一性(仅Map和Set):每个键唯一存在,Multimap和Multiset允许重复键。

应用场景

  • 数据库索引(如MySQL的B+树索引)
  • 配置参数映射(如INI文件解析)
  • 单词频次统计
  • 唯一元素集合管理

二、键值对(Key-Value Pair)

概念键值对是关联式容器的核心单元,通过键(Key)快速定位值(Value),适用于“一对一”或“一对多”映射场景。

SGI-STL中关于键值对的定义:

template <class T1, class T2>
struct pair
{typedef T1 first_type;typedef T2 second_type;T1 first;T2 second;pair(): first(T1()), second(T2()){}pair(const T1& a, const T2& b): first(a), second(b){}
};

三、Map:高效键值映射

3.1 核心特性

  • 唯一键:每个键只能对应一个值。
  • 自动排序:元素按键升序存储(可自定义比较函数)。

 3.2 map的构造

3.3  map的迭代器

3.4  map的容量与元素访问

 3.5. map中元素的修改

3.6 map小结

  • 1. map中的的元素是键值对
  • 2. map中的key是唯一的,并且不能修改
  • 3. 默认按照小于的方式对key进行比较
  • 4. map中的元素如果用迭代器去遍历,可以得到一个有序的序列
  • 5. map的底层为平衡搜索树(红黑树),查找效率比较高$O(log_2 N)$
  • 6. 支持[]操作符,operator[]中实际进行插入查找。

四、Set:唯一元素集合

4.1 核心特性

  • 元素即键:存储不重复的元素,仅支持按值查找。
  • 自动去重:插入重复元素无效。

4.2 set的构造

 4.3 set的迭代器

4.4 set的容量

4.5 set修改操作

4.6 应用场景

  • 用户ID去重
  • 集合运算(如set_intersection、set_union)

五、Multimap与Multiset:支持重复键的扩展容器

容器

键是否唯一

值是否唯一

适用场景

Multimap

邮件地址分组、学生课程映射

Multiset

单词频次统计、学生成绩排名

容器

插入/删除

查找

键是否唯一

是否允许修改键

适用场景

Map

O(logN)

O(logN)

需要键值映射的场景

Set

O(logN)

O(logN)

唯一元素集合管理

Multimap

O(logN)

O(logN)

一对多映射(如用户-角色)

Multiset

O(logN)

O(logN)

允许重复的统计场景

选型建议

  • 若需键值映射键唯一,优先选择Map。
  • 若仅需存储唯一元素,使用Set。
  • 若存在一对多关系,选用Multimap(如用户-邮件地址)。

六、总结

Map和Set作为基于红黑树的关联式容器,提供了平衡的时间复杂度和有序性保障,适用于需要高效查找和唯一性管理的场景。开发者需根据实际需求权衡有序性、唯一性及性能因素,灵活选择容器类型(Map vs unordered_map、Set vs Multiset),并合理使用API以避免潜在陷阱(如下标操作副作用)。深入理解其底层原理,有助于在复杂系统中设计高效的数据结构。


以上就是关于树型结 构的关联式容器主总结,如果有发现问题的小伙伴,请在评论区说出来哦。后面还会持续更新C++相关知识,感兴趣请持续关注我哦!! 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 大视界 -- Java 大数据在智能家居能源管理与节能优化中的应用(120)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

DeepSeek-R1本地化部署(Mac)

一、下载 Ollama 本地化部署需要用到 Ollama&#xff0c;它能支持很多大模型。官方网站&#xff1a;https://ollama.com/ 点击 Download 即可&#xff0c;支持macOS,Linux 和 Windows&#xff1b;我下载的是 mac 版本&#xff0c;要求macOS 11 Big Sur or later&#xff0c;Ol…

手写简易Tomcat核心实现:深入理解Servlet容器原理

目录 一、Tomcat概况 1. tomcat全局图 2.项目结构概览 二、实现步骤详解 2.1 基础工具包&#xff08;com.qcby.util&#xff09; 2.1.1 ResponseUtil&#xff1a;HTTP响应生成工具 2.1.2 SearchClassUtil&#xff1a;类扫描工具 2.1.3 WebServlet&#xff1a;自定义注解…

OpenHarmony子系统开发编译构建指导

OpenHarmony子系统开发编译构建指导 概述 OpenHarmony编译子系统是以GN和Ninja构建为基座&#xff0c;对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能扩展的系统&#xff0c;该系统提供以下基本功能&#xff1a; 以部件为最小粒度拼装产品和独…

红日靶场(一)——个人笔记

说明&#xff1a; 红日靶场官网 http://vulnstack.qiyuanxuetang.net/vuln/detail/2/ 靶场默认密码 hongrisec2019 预留空间 【攻击机Kail_2023.3】70G 【靶场win7】32G 【靶场Win2K3 】11G 【靶场winserver08】23G 环境搭建 修改VMnet1、VMnet2网卡的地址 将VMnet1作为内…

网络基础(一)【网络发展/认识协议/网络 VS 系统/以太网通信原理/重谈协议/网络中的地址管理】

网络基础&#xff08;一&#xff09; 1. 网络的发展2. 认识协议3. 网络 VS 系统4. 以太网通信原理5. 重谈协议6. 网络中的地址管理 1. 网络的发展 最开始时&#xff0c;计算机之间相互独立。 但是为了协作完成一些任务&#xff0c;就产生了计算机之间相互通讯的需求&#xff0c…

【ESP-IDF】组件

前言 对于要封装自己的库&#xff0c;在ESP-IDF中&#xff0c;可以采用构建组件的方式导入&#xff0c;而不是单纯在文件夹下导入.h和.c文件&#xff0c;不然一旦要导入的文件过多&#xff0c;它们背后的依赖可能就会相互交叉&#xff0c;不在方便移除和复用。本文就分别讲述&a…

AR配置静态IP双链路负载分担示例

AR配置静态IP双链路负载分担示例 适用于大部分企业网络出口 业务需求&#xff1a; 运营商1分配的接口IP为100.100.1.2&#xff0c;子网掩码为255.255.255.252&#xff0c;网关IP为100.100.1.1。 运营商2分配的接口IP为200.200.1.2&#xff0c;子网掩码为255.255.255.248&am…

视觉 Yolov11 环境配置(GPU版)

虚拟环境 首先用 anaconda 创建虚拟环境 根据自己需求创建一个虚拟环境 一个环境名叫 yolov11-py-3-8 就创建好了&#xff0c;后续的 yolov11 就会以这个环境去做深度学习&#xff08;这里不建议把环境的 py 版本设置到最新&#xff0c;设置个 3.8 或者 3.10 完全够用了 &am…

【微知】如何命令行查看Linux上连接的Wi-Fi信息?(iw dev wlp4s0 link ; information wireless)

背景 有时候没有桌面查看wifi链接&#xff0c;如何命令行查看 命令 iw dev wlp4s0 linkman手册&#xff1a; 实操 综述 如果查看信号强度、协商速率日常使用中比较常用。

从0到1入门Linux

一、常用命令 ls 列出目录内容 cd切换目录mkdir创建新目录rm删除文件或目录cp复制文件或目录mv移动或重命名文件和目录cat查看文件内容grep在文件中查找指定字符串ps查看当前进程状态top查看内存kill终止进程df -h查看磁盘空间存储情况iotop -o直接查看比较高的磁盘读写程序up…

[HTTP协议]应用层协议HTTP从入门到深刻理解并落地部署自己的云服务(2)实操部署

标题&#xff1a;[HTTP协议]应用层协议HTTP从入门到深刻理解并落地部署自己的云服务(2)实操部署 水墨不写bug 文章目录 一、无法拷贝类(class uncopyable)的设计解释&#xff1a;重要思想&#xff1a;使用示例 二、锁的RAII设计解释重要考虑使用示例 三、基于RAII模式和互斥锁…

登录固定账号和密码:账号:hmheima

接口文档 【apifox】面试宝典 个人中心-保存用户数据信息 - 教学练测项目-面试宝典-鸿蒙 登录固定账号和密码&#xff1a; 账号&#xff1a;hmheima 密码&#xff1a;Hmheima%123 UI设计稿 【腾讯 CoDesign】面试宝典 CoDesign - 腾讯自研设计协作平台 访问密码&#xff1…

Docker和DockerCompose基础教程及安装教程

Docker的应用场景 Web 应用的自动化打包和发布。自动化测试和持续集成、发布。在服务型环境中部署和调整数据库或其他的后台应用。从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。 CentOS Docker 安装 使用官方安装脚本自动安装 安装命令…

C语言学习笔记-进阶(7)字符串函数3

1. strstr的使用和模拟实现 char * strstr ( const char * str1, const char * str2); Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1. &#xff08;函数返回字符串str2在字符串str1中第⼀次出现的位置&#x…

Elasticsearch为索引设置自动时间戳,ES自动时间戳

文章目录 0、思路1、配置 ingest pipeline2、在索引映射中启用_source字段的时间戳3、使用 index template 全局设置时间戳4、写入测试数据5、验证结果6、总结 在使用 Elasticsearch 进行数据存储和检索时&#xff0c;时间戳字段是一个非常重要的组成部分。它可以帮助我们追踪数…

2024四川大学计算机考研复试上机真题

2024四川大学计算机考研复试上机真题 2024四川大学计算机考研复试机试真题 历年四川大学计算机考研复试机试真题 在线评测&#xff1a;https://app2098.acapp.acwing.com.cn/ 分数求和 题目描述 有一分数序列&#xff1a; 2/1 3/2 5/3 8/5 13/8 21/13… 求出这个数列的前 …

韩国互联网巨头 NAVER 如何借助 StarRocks 实现实时数据洞察

作者&#xff1a; Youngjin Kim Team Leader, NAVER Moweon Lee Data Engineer, NAVER 导读&#xff1a;开源无国界&#xff0c;在“StarRocks 全球用户精选案例”专栏中&#xff0c;我们将介绍韩国互联网巨头 NAVER 的 StarRocks 实践案例。 NAVER 成立于 1999 年&#xff0…

VanillaVueSvelteReactSolidAngularPreact前端框架/库的简要介绍及其优势

VanillaVueSvelteReactSolidAngularPreact前端框架/库的简要介绍及其优势。以下是这些前端框架/库的简要介绍及其优势&#xff1a; 1. Vanilla 定义&#xff1a;Vanilla 并不是一个框架&#xff0c;而是指 原生 JavaScript&#xff08;即不使用任何框架或库&#xff09;。优势…

图像滑块对比功能的开发记录

背景介绍 最近&#xff0c;公司需要开发一款在线图像压缩工具&#xff0c;其中的一个关键功能是让用户直观地比较压缩前后的图像效果。因此&#xff0c;我们设计了一个对比组件&#xff0c;它允许用户通过拖动滑块&#xff0c;动态调整两张图像的显示区域&#xff0c;从而清晰…