STL——mapmultimap和setmultiset
一、关联式容器
与序列式容器相同,关联式容器也是用于存储数据的,不同的是,关联式容器里存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。
二、键值对
用来表示具有一一对应的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。
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) {}
};
三、树形结构的关联式容器
根据应用场景的不同,STL总共实现了两种不同结构的关联式容器:树形结构和哈希结构。
树形结构的关联式容器主要有四种:map、set、multimap、multiset,这种四种容器的共同点是:使用平衡搜索树(红黑树)作为其底层结构,容器中的元素是一个有序的序列。
四、map
1.map文档介绍
(1)map是关联式容器,它按照特定的次序(按key来比较)存储由键值key和值value组合而成的元素。
(2)在map中,键值key通常用于排序和唯一的标识元素,而值value中存储与此键值key关联的内容。键值key和value的类型可能不同,并且在map内部,key与value通过成员类型value_type绑定在一起,为其取别名称pair:typedef pair value_type。
(3)在内部,map中的元素总是按照键值key进行比较排序。
(4)map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。
(5)map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。
(6)map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。
2.map的使用
2.1 map的模板参数列表
template <class Key, //map::key_typeclass T, //map::mapped_typeclass Compare = less<Key>, //map::key_compareclass Alloc = allocator<pair<const Key, T>>//map::allocator_type
> class map;
Key:键值对中key的类型;
T:键值对中value的类型;
Compare:比较器的类型,map中的元素是按照key来比较的,缺省情况下按照小于来比较,一般情况下(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户自己显示传递比较规则(一般情况下按照函数指针或仿函数来传递);
Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的空间配置器。
2.2 map的构造

2.3 map的迭代器

2.4 map的容量与元素访问

当key不存在时,通过operator获取对应value时会发生什么?
当key不存在时,operator[]会使用默认的value和key构造键值对然后插入map中,并返回该默认的value。
元素访问操作at(),其key不存在时,会发生什么?
该函数也是通过key找到与之对应的value,然后返回其引用。与operator[]不同的是,当key1不存在时,at()函数会直接抛异常。
2.5 map中元素的修改

2.6 map总结
(1)map中的元素是键值对;
(2)map中的key是唯一的,并且不能修改;
(3)默认按照小于的方式对key进行比较;
(4)map中的元素如果用迭代器遍历,可以得到一个有序的序列;
(5)map的底层为平衡搜索树(红黑树),查找效率较高,为O();
(6)map支持[]操作符,operator[]中实际进行插入查找。
五、multimap
1. multimap文档介绍
(1)multimap是关联式容器,它按照特定顺序,存储由key和value组成的键值对<key,value>,其中多个键值对之间的key是可以重复的。
(2)在multimap中,通常按照key排序和唯一的标识元素,而映射的value存储与key关联。key和value的类型可能不同,通过multimap内部的成员类型value_type组合在一起,value_type是组合key和value的键值对:typedef pair<const key, T> value_type。
(3)在内部,multimap中的元素总数通过其内部比较对象,按照指定的特定严格弱排序标准对key进行排序。
(4)multimap通过key访问单个元素的速度通常比unordered_multimap容器慢,但是使用迭代器直接遍历multimap中的元素可以得到关于key有序序列。
(5)multimap在底层使用的是二叉搜索树(红黑树)来实现。
注意:
multimap与map的唯一不同就是:map的key是唯一的,而multimap的key是可以重复的。
2. multimap的使用
multimap的功能与map类似,其接口可以参考map使用。唯一区别就是multimap的key可以重复,所以multimap也没有实现重载operator[]操作。
六、set
1.set文档介绍
(1)set是按照一定次序存储元素的容器。
(2)在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须唯一。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
(3)在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
(4)set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。
(5)set底层采用的是二叉搜索树(红黑树)实现的。
注意:
(1)与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set中只存放value,但在底层实际存放的是由<value, value>构成的键值对。
(2)set中插入元素时,只需要插入value即可,不需要构造键值对。
(3)set中元素不可以重复(因此可以使用set去重)。
(4)使用set迭代器遍历set中元素时,可以得到有序序列。
(5)set中的元素默认按照小于来比较(升序)。
(6)set中查找某个元素时,时间复杂度为
(7)set中的元素不允许修改。
(8)set中的底层是使用二叉搜索树(红黑树)来实现。
2.set的使用
2.1 set模板参数列表
template < class T, // set::key_type/value_typeclass Compare = less<T>, // set::key_compare/value_compareclass Alloc = allocator<T> // set::allocator_type> class set;
T:set中存放元素的类型,实际在底层存储<value, value>的键值对。
Compare:set中元素默认按照小于来比较。
Alloc:set中元素空间的管理方式,使用STL提供的空间配置器管理。
2.2 set的构造

2.3 set的迭代器

2.4 set的容量

2.5 set的修改操作

七、multiset
1. multiset文档介绍
(1)multiset是按照特定顺序存储元素的容器,其中元素是可以重复的。
(2)在multiset中,元素的value也会识别它(因为multiset中本身存储的就是<value,value>组成的键值对,因此value本身也是key,key就是value),multiset元素的值不能在容器中进行修改(因为元素总是const),但可以从容器中插入或删除。
(3)在multiset内部,元素总是按照其内部的比较规则所指示的特定严格弱排序准则进行排序。
(4)multiset容器通过key访问单个元素的速度通常比unordered_multiset容器慢,但当使用迭代器遍历时,可以得到一个有序序列。
(5)multiset底层结构为二叉搜索树(红黑树)。
总结:
(1)multiset在底层中存储的是<value,value>的键值对。
(2)multiset的插入接口中,只需要插入元素value即可。
(3)与set的区别:multiset中的元素可以重复,而set中的元素是唯一的。
(4)使用迭代器对multiset中的元素进行遍历,可以得到有序序列。
(5)multiset中的元素不能修改。
(6)在multiset中查找某个元素,时间复杂度为O()。
(7)multiset的作用:可以对元素进行排序。
2. multiset的使用
multiset的接口与set基本相同,可以参考set使用。
相关文章:
STL——mapmultimap和setmultiset
一、关联式容器 与序列式容器相同,关联式容器也是用于存储数据的,不同的是,关联式容器里存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。 二、键值对 用来表示具有一一对应的一种结构,该…...
2023热门抖音权重查询小程序源码
2023热门抖音权重查询小程序源码 跟抖音上很火的一模一样,小程序适配优化。接口免费。小程序不是网页 修改教程: 1,如果想修改或者去除水印,直接删除或修改“index.html”12~22行 2,如果想修改logo,直接…...
153.网络安全渗透测试—[Cobalt Strike系列]—[生成hta/exe/宏后门]
我认为,无论是学习安全还是从事安全的人多多少少都会有些许的情怀和使命感!!! 文章目录一、后门简介1、hta后门2、exe后门3、宏病毒后门二、生成后门并测试0、测试环境1、生成hta后门并测试2、生成exe后门并测试3、生成宏病毒后门…...
如何成为优秀的程序员
崔宝秋,现任小米首席架构师、小米云平台负责人。1995年赴美留学,纽约州立大学石溪分校计算机科学系博士毕业,曾任IBM高级工程师和高级研发经理、雅虎搜索技术核心团队主任工程师、LinkedIn主任工程师,2012年回国加入小米科技。 20…...
多线程(四):线程安全
在开始讲解线程安全之前我们先来回顾一下我们学了那些东西了: 1. 线程和进程的认识 2. Thread 类的基本用法 3. 简单认识线程状态 4. 初见线程安全 上一章结束时看了一眼线程安全问题,本章将针对这个重点讲解。 一个代码在单线程中能够安全执行&am…...
[ROC-RK3568-PC] [Firefly-Android] 10min带你了解Camera的使用
🍇 博主主页: 【Systemcall小酒屋】🍇 博主追寻:热衷于用简单的案例讲述复杂的技术,“假传万卷书,真传一案例”,这是林群院士说过的一句话,另外“成就是最好的老师”,技术…...
C++之模拟实现string
文章目录前言一、包含的相关头文件二、构造和析构1.构造函数2.拷贝构造1.传统写法2.现代写法3.赋值运算符重载1.传统写法2.现代写法4.析构函数三、iterator四、modify1.push_back(尾插一个字符)2.append(尾插一个字符串)3.运算符重载1.尾插字…...
SpringBoot实战(十三)集成 Admin
目录一、简介二、搭建 springboot-admin 管理服务1.Maven 依赖2.application.yml3.添加 EnableAdminServer4.启动服务,查看页面三、搭建 springboot-admin-client 客户端服务1.Maven 依赖2.application.yml3.启动服务,查看页面四、搭配 Eureka 使用1.搭建…...
mke2fs命令:建立ext2文件系统
以下内容源于网络资源的学习与整理,如有侵权请告知删除。 使用格式 mke2fs [options] [设备名称] [区块数] options与含义 -c:检查是否有损坏的区块。-F:不管指定的设备为何,强制执行mke2fs。-M:记录最后一次挂入的…...
免费分享一个springboot+vue的办公系统
springbootvue的OA系统项目介绍项目部署项目特点项目展示项目介绍 这是一个采用前后端分离开发的项目,前端采用 Vue 开发、后端采用 SpringBoot Mybatis 开发。 很适合java初学者练手和学习。 前端技术:Vue3.2 Vue-Router Pinia Ant Design Vue 3.X…...
STM32数据搬运工DMA
DMA的概念DMA,全称为:Direct Memory Access,即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路ÿ…...
4、操作系统——进程间通信(2)(system V-IPC介绍)
目录 一、system V-IPC常识 1、key和ID 2、文件描述符 3、函数(ftok) ftok产生IPC对象的健值key(类似文件路径) 4、例子 5、使用命令查看或删除当前系统中的IPC对象 一、system V-IPC常识 1、key和ID (1&#x…...
基于CentOS Stream 9平台搭建Nacos2.0.4集群以及OpenResty反向代理
目录展示Nacos2.0.4集群搭建1. 下载2. 解压3.修改配置3.1分别修改下启动类中JDK路径以及启动大小3.2 分别配置数据源3.3 创建nacos数据库3.4 修改cluster.conf配置3.4.1 复制并修改3.4.2 编辑文件,修改三台主机地址3.4.3 分别放入另外两个nacos的conf目录下:4. 启动…...
老杜MySQL入门基础 第二天
导入演示数据 1、连接MySQL 2、创建"bjpowernode"数据库 create database bjpowernode;3、选择数据库 use bjpowernode4、导入数据 source D:\bjpowernode.sql(文件的路径)1 去除重复记录(把查询结果去除重复记录)(原表数据不会改变) 使用关键字dist…...
Python深度学习实战:人脸关键点(15点)检测pytorch实现
引言 人脸关键点检测即对人类面部若干个点位置进行检测,可以通过这些点的变化来实现许多功能,该技术可以应用到很多领域,例如捕捉人脸的关键点,然后驱动动画人物做相同的面部表情;识别人脸的面部表情,让机…...
linux简单入门
目录Linux简介Linux目录结构Linux文件命令文件处理命令文件查看命令常用文件查看命令Linux的用户和组介绍Linux权限管理Linux简介 Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯本纳第克特托瓦兹࿰…...
给准备面试网络工程师岗位的应届生一些建议
你听完这个故事,应该会有所收获。最近有一个23届毕业的大学生和我聊天,他现在网络工程专业大四,因为今年6、7月份的时候毕业,所以现在面临找工作的问题。不管是现在找一份实习工作,还是毕业后找一份正式工作࿰…...
主线程与子线程之间相互通信(HandlerThread)
平时,我们一般都是在子线程中向主线程发送消息(要在主线程更新UI),从而完成请求的处理。那么如果需要主线程来向子线程发送消息,希望子线程来完成什么任务。该怎么做?这就是这篇文章将要讨论的内容。 一、…...
13基于双层优化的电动汽车日前-实时两阶段市场竞标
MATLAB代码:基于双层优化的电动汽车日前-实时两阶段市场竞标 关键词:日前-实时市场竞标 电动汽车 双层优化 编程语言:MATLAB平台 参考文献:考虑电动汽车可调度潜力的充电站两阶段市场投标策略_詹祥澎 内容简介:…...
REDIS19_zipList压缩列表详解、快递列表 - QuickList、跳表 - SkipList
文章目录①. 压缩列表 - zipList②. 快递列表 - QuickList③. 跳表 - SkipList①. 压缩列表 - zipList ①. ZipList是一种特殊的"双端链表",由一系列特殊编码的连续内存块组成。可以在任意一端进行压入/弹出操作,并且该操作的时间复杂度为O(1) (oxff:11111111) type…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
