当前位置: 首页 > news >正文

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(log_{2}^{N});

(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中查找某个元素时,时间复杂度为log_{2}^{n}

(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(log_{2}^{N})。

(7)multiset的作用:可以对元素进行排序。

2. multiset的使用

        multiset的接口与set基本相同,可以参考set使用。

相关文章:

STL——mapmultimap和setmultiset

一、关联式容器 与序列式容器相同&#xff0c;关联式容器也是用于存储数据的&#xff0c;不同的是&#xff0c;关联式容器里存储的是<key, value>结构的键值对&#xff0c;在数据检索时比序列式容器效率更高。 二、键值对 用来表示具有一一对应的一种结构&#xff0c;该…...

2023热门抖音权重查询小程序源码

2023热门抖音权重查询小程序源码 跟抖音上很火的一模一样&#xff0c;小程序适配优化。接口免费。小程序不是网页 修改教程: 1&#xff0c;如果想修改或者去除水印&#xff0c;直接删除或修改“index.html”12&#xff5e;22行 2&#xff0c;如果想修改logo&#xff0c;直接…...

153.网络安全渗透测试—[Cobalt Strike系列]—[生成hta/exe/宏后门]

我认为&#xff0c;无论是学习安全还是从事安全的人多多少少都会有些许的情怀和使命感&#xff01;&#xff01;&#xff01; 文章目录一、后门简介1、hta后门2、exe后门3、宏病毒后门二、生成后门并测试0、测试环境1、生成hta后门并测试2、生成exe后门并测试3、生成宏病毒后门…...

如何成为优秀的程序员

崔宝秋&#xff0c;现任小米首席架构师、小米云平台负责人。1995年赴美留学&#xff0c;纽约州立大学石溪分校计算机科学系博士毕业&#xff0c;曾任IBM高级工程师和高级研发经理、雅虎搜索技术核心团队主任工程师、LinkedIn主任工程师&#xff0c;2012年回国加入小米科技。 20…...

多线程(四):线程安全

在开始讲解线程安全之前我们先来回顾一下我们学了那些东西了&#xff1a; 1. 线程和进程的认识 2. Thread 类的基本用法 3. 简单认识线程状态 4. 初见线程安全 上一章结束时看了一眼线程安全问题&#xff0c;本章将针对这个重点讲解。 一个代码在单线程中能够安全执行&am…...

[ROC-RK3568-PC] [Firefly-Android] 10min带你了解Camera的使用

&#x1f347; 博主主页&#xff1a; 【Systemcall小酒屋】&#x1f347; 博主追寻&#xff1a;热衷于用简单的案例讲述复杂的技术&#xff0c;“假传万卷书&#xff0c;真传一案例”&#xff0c;这是林群院士说过的一句话&#xff0c;另外“成就是最好的老师”&#xff0c;技术…...

C++之模拟实现string

文章目录前言一、包含的相关头文件二、构造和析构1.构造函数2.拷贝构造1.传统写法2.现代写法3.赋值运算符重载1.传统写法2.现代写法4.析构函数三、iterator四、modify1.push_back(尾插一个字符&#xff09;2.append&#xff08;尾插一个字符串&#xff09;3.运算符重载1.尾插字…...

SpringBoot实战(十三)集成 Admin

目录一、简介二、搭建 springboot-admin 管理服务1.Maven 依赖2.application.yml3.添加 EnableAdminServer4.启动服务&#xff0c;查看页面三、搭建 springboot-admin-client 客户端服务1.Maven 依赖2.application.yml3.启动服务&#xff0c;查看页面四、搭配 Eureka 使用1.搭建…...

mke2fs命令:建立ext2文件系统

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 使用格式 mke2fs [options] [设备名称] [区块数] options与含义 -c&#xff1a;检查是否有损坏的区块。-F&#xff1a;不管指定的设备为何&#xff0c;强制执行mke2fs。-M&#xff1a;记录最后一次挂入的…...

免费分享一个springboot+vue的办公系统

springbootvue的OA系统项目介绍项目部署项目特点项目展示项目介绍 这是一个采用前后端分离开发的项目&#xff0c;前端采用 Vue 开发、后端采用 SpringBoot Mybatis 开发。 很适合java初学者练手和学习。 前端技术&#xff1a;Vue3.2 Vue-Router Pinia Ant Design Vue 3.X…...

STM32数据搬运工DMA

DMA的概念DMA&#xff0c;全称为&#xff1a;Direct Memory Access&#xff0c;即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输&#xff0c;也没有中断处理方式那样保留现场和恢复现场的过程&#xff0c;通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路&#xff…...

4、操作系统——进程间通信(2)(system V-IPC介绍)

目录 一、system V-IPC常识 1、key和ID 2、文件描述符 3、函数&#xff08;ftok&#xff09; ftok产生IPC对象的健值key&#xff08;类似文件路径&#xff09; 4、例子 5、使用命令查看或删除当前系统中的IPC对象 一、system V-IPC常识 1、key和ID &#xff08;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 编辑文件&#xff0c;修改三台主机地址3.4.3 分别放入另外两个nacos的conf目录下:4. 启动…...

老杜MySQL入门基础 第二天

导入演示数据 1、连接MySQL 2、创建"bjpowernode"数据库 create database bjpowernode;3、选择数据库 use bjpowernode4、导入数据 source D&#xff1a;\bjpowernode.sql(文件的路径)1 去除重复记录(把查询结果去除重复记录)(原表数据不会改变) 使用关键字dist…...

Python深度学习实战:人脸关键点(15点)检测pytorch实现

引言 人脸关键点检测即对人类面部若干个点位置进行检测&#xff0c;可以通过这些点的变化来实现许多功能&#xff0c;该技术可以应用到很多领域&#xff0c;例如捕捉人脸的关键点&#xff0c;然后驱动动画人物做相同的面部表情&#xff1b;识别人脸的面部表情&#xff0c;让机…...

linux简单入门

目录Linux简介Linux目录结构Linux文件命令文件处理命令文件查看命令常用文件查看命令Linux的用户和组介绍Linux权限管理Linux简介 Linux&#xff0c;全称GNU/Linux&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff0…...

给准备面试网络工程师岗位的应届生一些建议

你听完这个故事&#xff0c;应该会有所收获。最近有一个23届毕业的大学生和我聊天&#xff0c;他现在网络工程专业大四&#xff0c;因为今年6、7月份的时候毕业&#xff0c;所以现在面临找工作的问题。不管是现在找一份实习工作&#xff0c;还是毕业后找一份正式工作&#xff0…...

主线程与子线程之间相互通信(HandlerThread)

平时&#xff0c;我们一般都是在子线程中向主线程发送消息&#xff08;要在主线程更新UI&#xff09;&#xff0c;从而完成请求的处理。那么如果需要主线程来向子线程发送消息&#xff0c;希望子线程来完成什么任务。该怎么做&#xff1f;这就是这篇文章将要讨论的内容。 一、…...

13基于双层优化的电动汽车日前-实时两阶段市场竞标

MATLAB代码&#xff1a;基于双层优化的电动汽车日前-实时两阶段市场竞标 关键词&#xff1a;日前-实时市场竞标 电动汽车 双层优化 编程语言&#xff1a;MATLAB平台 参考文献&#xff1a;考虑电动汽车可调度潜力的充电站两阶段市场投标策略_詹祥澎 内容简介&#xff1a;…...

REDIS19_zipList压缩列表详解、快递列表 - QuickList、跳表 - SkipList

文章目录①. 压缩列表 - zipList②. 快递列表 - QuickList③. 跳表 - SkipList①. 压缩列表 - zipList ①. ZipList是一种特殊的"双端链表",由一系列特殊编码的连续内存块组成。可以在任意一端进行压入/弹出操作,并且该操作的时间复杂度为O(1) (oxff:11111111) type…...

BEYOND REALITY Z-Image实测:同一张脸,两种质感,细节对比一目了然

BEYOND REALITY Z-Image实测&#xff1a;同一张脸&#xff0c;两种质感&#xff0c;细节对比一目了然 今天我要带大家做一个有趣的实验。想象一下&#xff0c;你面前站着同一个人&#xff0c;但左边是手机快照&#xff0c;右边是专业单反拍摄的照片——这就是BEYOND REALITY Z…...

Flow Matching 流匹配策略:从理论到机器人实时控制

目录 1.1.1.1 流匹配的基本定义 1.1.1.2 连续性方程与概率路径演化 1.1.1.3 流匹配损失函数的标准形式 1.2.1.1 条件概率路径的构造原理 1.2.1.2 条件向量场的确定性映射 1.2.1.3 条件流匹配损失的等价性证明 1.2.1.4 线性插值路径的实例化 2.1.1.1 Kantorovich最优传输…...

掌握Python自动化抢票:开源工具助你高效获取演唱会门票

掌握Python自动化抢票&#xff1a;开源工具助你高效获取演唱会门票 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 在演出票务竞争日益激烈的当下&#xff0c;手动抢票已难以应对毫秒级的抢票环境…...

实战指南 | TSMaster 的 CAN UDS 诊断自动化流程与 BootLoader 刷写详解

1. TSMaster诊断控制台深度解析 诊断控制台是TSMaster进行UDS诊断的核心操作界面&#xff0c;相当于工程师与ECU对话的"翻译器"。我第一次接触这个界面时&#xff0c;被它清晰的四分区设计惊艳到了——就像汽车仪表盘把转速、车速、油量分区域显示一样直观。 服务命令…...

Granite TimeSeries FlowState R1 多步预测效果展示:长期趋势与不确定性量化

Granite TimeSeries FlowState R1 多步预测效果展示&#xff1a;长期趋势与不确定性量化 时间序列预测&#xff0c;听起来挺专业的&#xff0c;但说白了&#xff0c;就是根据过去的数据&#xff0c;猜猜未来会发生什么。比如&#xff0c;老板问你&#xff1a;“下个月咱们产品…...

3步实现UMA模型吸附能预测:从数据准备到结果验证完整指南

3步实现UMA模型吸附能预测&#xff1a;从数据准备到结果验证完整指南 【免费下载链接】ocp Open Catalyst Projects library of machine learning methods for catalysis 项目地址: https://gitcode.com/GitHub_Trending/oc/ocp 在催化材料研究中&#xff0c;吸附能是评…...

StructBERT在代码仓库管理中的重复代码检测应用

StructBERT在代码仓库管理中的重复代码检测应用 你有没有遇到过这种情况&#xff1f;在代码审查时&#xff0c;总觉得某段代码似曾相识&#xff0c;但又说不清在哪见过。或者&#xff0c;团队里不同成员为了解决类似问题&#xff0c;各自写了一套逻辑相近但细节不同的代码&…...

5步掌握Loop:让Mac窗口管理效率提升10倍的免费开源方案

5步掌握Loop&#xff1a;让Mac窗口管理效率提升10倍的免费开源方案 【免费下载链接】Loop MacOS窗口管理 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop 在数字工作环境中&#xff0c;窗口管理已成为影响效率的隐形瓶颈。Mac用户每天平均需要执行200次窗口操作…...

Java函数冷启动优化不是“选配”,而是SLA硬指标!一线大厂SRE团队正在紧急落地的6项Kubernetes调度增强策略

第一章&#xff1a;Java函数冷启动的本质与SLA倒逼机制Java函数冷启动并非单纯“首次加载慢”的表象&#xff0c;而是JVM生命周期、类加载机制、字节码验证、即时编译&#xff08;JIT&#xff09;预热及运行时元数据初始化等多层系统行为在无预热上下文下的集中爆发。当Serverl…...

避坑指南:在ESXi或Proxmox VE虚拟化平台下配置Intel I350网卡直通与PXE启动

虚拟化环境下的Intel I350网卡直通与PXE启动全流程解析 在虚拟化技术日益普及的今天&#xff0c;企业级用户经常面临将物理网卡直通给虚拟机并实现PXE网络启动的需求。Intel I350系列网卡以其稳定性和高性能成为众多虚拟化平台的首选&#xff0c;但在ESXi和Proxmox VE等环境中…...