【C++】STL关联式容器之map和set

news2024/11/20 0:35:50

【关联式容器】之map和set

  • 容器类型
  • 树形结构的关联式容器
    • map
    • set,multiset,multimap的区别与联系

容器类型

在STL中,我们接触过许多容器,例如:vector,list,stack,queue,map,set,unordered_map,unordered_set,multimap,multiset等,实际上是可以将其分为两种类型。


第一种是序列式容器:其底层结构为线性序列的数据结构
第二种是关联式容器:其存储的类型是键值对,这样的存储类型使得在数据检索时比序列式容器的效率更高

序列式容器关联式容器
vector,list,stack,queuemap,multimap,set,mutiset,unordered_map, unordered_set,unordered_multimap,unordered_multiset

树形结构的关联式容器

STL实现了两种不同结构的关联式容器,树形结构和哈希结构(C++11实现的)。
而树形结构的关联式容器有四种:map、set、multimap、multiset,它们的特点是使用平衡搜索树(也就是红黑树)作为其底层结构,按照key是有序的。

而另外一种哈希结构的关联式容器也有四种:unordered_map,unordered_set,unordered_multimap,unordered_multiset,它们的特点是使用哈希作为其底层结构,key是无序的。

map

map中的模板参数是:
在这里插入图片描述
其中key表示键值对中key的类型,T表示键值对中value的类型,compare表示比较器的类型,比较方式是按照key来进行比较的,如果没有传递比较方法,是按照小于来比较。Allocator是空间配置器,用来申请底层空间,一般不需要传递。

map的构造:

函数声明功能介绍
map()构造一个空的map
map ( const map<Key,T,Compare,Allocator>& x )拷贝构造
map ( InputIterator first, InputIterator last,const Compare& comp = Compare(), const Allocator& = Allocator() )通过迭代器进行构造

map的迭代器:

函数声明功能介绍
`begin() /end()begin()`:首元素的位置,end():最后一个元素的下一个位置
rbegin()/rend()反向迭代器,rbegin()在end的位置,rend()在begin()的位置

map的容量和元素访问

函数声明功能介绍
bool empty ( ) const检测map中的元素是否为空,是返回true,否则返回false
size_type size() const返回map中有效元素的个数
mapped_type& operator[] (constkey_type& k)返回key对应的value

operator[]和at的区别

请注意:如果使用[]来进行元素访问时,本质上是通过key找到与key对应的value,将键值对进行返回,但是如果没有对应的key,那么会用当前key和默认value构造键值对进行插入,然后返回默认的value,也就意味着,使用[]时,无论key存在与否,都会返回一个value。而使用at时,如果key不存在,at()函数直接抛异常

map中元素的修改

函数声明功能介绍
pair<iterator,bool> insert (const value_type& x )插入一个键值对x,返回的也是键值对, 返回的first表示插入元素的位置,second表示插入是否成功
void erase ( iterator position )删除pos位置的元素
size_type erase ( constkey_type& x )删除键值key为x的元素
void erase ( iterator first,iterator last )删除迭代器区间为[first,last)之间的元素

set,multiset,multimap的区别与联系

与map相比,set中只有value,没有key,其余的特性和map是一样的
而multiset是在set的基础上,value由唯一变为了可以重复,仅此而已,特点是multiset可以对元素进行排序。
而multimap是在map的基础上,key由唯一变为了可以重复,通过multimap对元素进行访问时通常比unordered_multimap慢,但是使用迭代器对multimap进行遍历时,会得到关于key有序的序列。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Version of Delve is too old for this version of Go

背景 编译go报错提示信息&#xff0c;delve版本太老 执行下载dlv.exe go install github.com/go-delve/delve/cmd/dlvlatest 将下载的dlv文件放在ide目录下替换

基于DSP28335的三电平有源电力滤波器

完整的软硬件资料&#xff0c;其中包括两套基于DSP28335的三电平有源电力滤波器。这些资料可以直接使用。 提取的知识点和领域范围&#xff1a; 三电平有源电力滤波器DSP28335芯片 延申科普&#xff1a; 三电平有源电力滤波器是一种用于电力系统中的滤波器&#xff0c;用于减…

vue实现简单登录界面

使用Vue实现简单的用户登录界面&#xff0c;登录成功做路由跳转&#xff0c;背景图片可自定义。实现效果如下&#xff1a; html部分 <template><div class"content"><div class"login_container"><el-form v-model"loginData&q…

Locate and Label: A Two-stage Identifier for Nested Named EntityRecognition

原文链接&#xff1a;https://aclanthology.org/2021.acl-long.216.pdf ACL 2021 介绍 问题 span-based方法将实体识别当作span的分类任务来做&#xff0c;存在以下缺陷&#xff1a;1&#xff09;计算量大&#xff0c;为了尽可能覆盖到所有实体&#xff0c;就会对多个span进行…

基于YOLO V8的车牌识别

赵春江 2023年6月 1、前言 十年前就想实现车牌识别这项任务&#xff0c;虽然当时这项技术就已较成熟&#xff08;与现在的实现方法不同&#xff09;&#xff0c;但那时的我还具备这个能力。弹指一瞬间&#xff0c;没想到十年间人工智能技术已经发展到一个新的高度&#xff0c…

【每日编程Day29】有假币

目录 一、选择题 二、编程题 1、有假币 一、选择题 重点复习选择题4,8,10。 问题4&#xff1a; 类方法&#xff1a;又称为静态方法。而实例方法不能加static&#xff0c;又叫非静态方法。 类方法和实例方法的区别_类方法和实例方法区别_及可不遥的博客-CSDN博客 &#xff0…

效果!R微型变压器节省空间秘密揭晓!

通常&#xff0c;我们可能会遇到一些特殊的设备。由于其设计空间有限&#xff0c;R型变压器的体积应足够小&#xff0c;以便很好地应用。针对市场上的这个问题&#xff0c;作为R型变压器生产厂家&#xff0c;我们怎么能不注意呢&#xff1f;因此&#xff0c;我们的设计研发团队…

明确了!国家发布程序员和搬砖民工一样,都是农民工!

目录 前言 怎么解释新生代农民工&#xff1f; 2019年确定程序员属于密集型劳动者 新生代民工确实非常形象&#xff1a; 总结&#xff1a; 前言 前几天我们发现&#xff0c;人社局官网发布了一则报告&#xff0c;显示软件开发和信息技术服务业都属于新生农工&#xff0c;不…

前端获取地区的天气状况

翻阅了大量的帖子&#xff0c;在赛选了很多废的帖子之后找到了两个总体来说还不错的 一&#xff1a;配置高德地图 高德地图的查看天气的话&#xff0c;是每天免费100次 先访问高德官网&#xff1a;高德控制台&#xff0c;注册后申请应用&#xff0c;获取key值。 这个key值可…

三步轻松搞定,Word图片打印清晰度提升10倍

Word文档中插入图片是非常常见的操作&#xff0c;然而&#xff0c;在打印时有时会遇到图片清晰度不够的问题。这种情况下&#xff0c;即使图片在电脑上看起来很清晰&#xff0c;但是在打印时却变得模糊不清。这可能会影响工作效率&#xff0c;甚至影响到呈现效果。那么&#xf…

Java 面试必刷的1100 道Java大厂面试真题(含答案解析)

2023秋招即将来临&#xff0c;很多同学会问 Java 面试八股文有必要背吗&#xff1f; 我的回答是&#xff1a;很有必要。你可以讨厌这种模式&#xff0c;但你一定要去背&#xff0c;因为不背你就进不了大厂。 国内的互联网面试&#xff0c;恐怕是现存的、最接近科举考试的制度…

yolov8训练自有跌倒数据集

参考&#xff1a; https://www.bilibili.com/video/BV1xL411B7ax https://www.dgrt.cn/a/2364195.html?actiononClick https://blog.roboflow.com/how-to-train-yolov8-on-a-custom-dataset/ 1、数据集制作&#xff08;一般是coco格式&#xff09;&#xff1a; lableme&a…

如何用手机快速获得真人手办所需的人像模型

伴随网络生活覆盖面的增大&#xff0c;越来越多的领域需要三维模型 &#xff0c;比如最近爆火的真人手办就必须用到人像模型 。 真人手办的制作过程其实非常简单&#xff0c;在专门搭建的摄影棚内进行全身3D扫描&#xff0c;获得3D人体模型&#xff0c;然后进行修模&#xff0c…

WordCount是什么?WordCount编程实现思路

WordCount算是大数据计算领域经典的入门案例&#xff0c;相当于Hello World。 虽然WordCount业务极其简单&#xff0c;但是希望能够通过案例感受背后MapReduce的执行流程和默认的行为机制&#xff0c;这才是关键。 WordCount编程实现思路 map阶段的核心&#xff1a;把输入的数…

C#.NETWPF开发工业MES MCS系统软件源代码两套

产品介绍&#xff1a; C#.NETWPF开发工业MES MCS系统软件源代码两套 A&#xff0c;WPF MES 上位机产线执行系统。 1&#xff0c; 完整纯源代码&#xff1b; 2&#xff0c; AGV自动调度&#xff1b; 3&#xff0c; SQLSERVER数据库。带附加文件。 4&#xff0c; WPF各种技术…

慕了!17年阿里Java开发大佬把Spring Boot的精髓都总结出来了

目前ssm框架还是比较常用的&#xff0c;其中的ss指的无非就是Spring 和 SpringMVC&#xff0c;我们可以简单地认为 "Spring Boot ≥ Spring SpringMVC" &#xff0c;没错&#xff0c;用了Spring Boot中涵盖了Spring和SpringMVC等大量常用开发配置&#xff0c;而且S…

想知道识别文字的软件有哪些?分享文字识别软件有哪些

嗨~小伙伴们&#xff0c;你们是否有过手写笔记或者拍照存档时不小心照模糊、字迹潦草的经历呢&#xff1f;别担心&#xff0c;现在有很多文字识别软件可以帮助我们迅速将纸质笔记、图片等转化成电子版&#xff0c;方便管理和编辑。今天我们就一起来看看文字识别软件有哪些吧&am…

javaDoc中进行页面跳转

在写java代码时&#xff0c;我们可以写一些用于代码跳转或者网页跳转的注释&#xff0c;这样一来&#xff0c;我们在开发软件&#xff08;比如Idea&#xff09;中就可以通过ctrl鼠标直接跳转。 常用的是{link}和see&#xff0c;两种用法基本一样&#xff0c;区别见下方。 {link…

vant组件改为 uview-plus 组件的时分秒组件

项目中本来使用过了vant 的组件&#xff0c;但是uniapp 和vant并不兼容&#xff0c;除了几个普通的组件能用之外&#xff0c;想使用弹窗的话vant就完成不了了&#xff0c;还好uniapp官方支持的 uview-plus 支持vue3&#xff0c;就给项目更换了。之前使用vant封装的组件这时候也…

品达通用权限系统-Day02

文章目录 2.3 自定义starter2.3.1 案例一2.3.1.1 开发starter2.3.1.2 使用starter 2.3.2 案例二2.3.2.1 开发starter2.3.2.2 使用starter 2.3 自定义starter 本小节我们通过自定义两个starter来加强starter的理解和应用。 2.3.1 案例一 2.3.1.1 开发starter 开发工具&#…