C++ set和map的基本使用

news2024/11/16 8:49:05

set和map介绍

set和map是C++ STL中的关联式容器,关联式容器是容器里面存储的是<key, value>结构的
键值对,在数据检索时比序列式容器效率更高
键值对:
用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该应该单词,在词典中就可以找到与其对应的中文含义

set和map底层的实现都是使用的平衡搜索二叉树(红黑树),所以不能随便修改key,否则会破坏红黑树的搜索规则
set的key是不允许重复的,在插入的时候,如果set中已经有了要插入的数据,则不会插入,所以set具有去重的功能,同样,map也是不允许key重复的

set的基本使用

set头文件 :#include
set的定义:
在这里插入图片描述

pair是一个构造key 和 value结构的对象,内部有两个成员first(key),second(value)

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)
{}
};

在这里插入图片描述

set的构造函数:
在这里插入图片描述

插入:insert
在这里插入图片描述
set是红黑树结构,所以无法插入重复的值

删除:erase
在这里插入图片描述

查找:find
在这里插入图片描述
如果set中有要查找的元素,返回这个元素的迭代器,如果没有,返回set最后一个元素的下一个位置的迭代器

清空:clear
清空set中所有的数据
在这里插入图片描述

判空:empty
set为空返回true,不为空返回false
在这里插入图片描述

元素个数:size
在这里插入图片描述

交换:swap
将两个set对象的数据交换:
在这里插入图片描述

迭代器:
迭代器的使用方法类似于指针,需要通过*解引用来访问数据,但是在范围for中不需要解引用
在创建结构体对象的时候,需要指明set类型:
迭代器关键字:iterator
定义格式:set<类型> iterator 迭代器名

正向迭代器:
begin(返回第一个元素迭代器)
end(返回最后一个元素的下一个位置)
在这里插入图片描述
迭代器的使用和指针类似,是可以前后++ – 的
【注意】end返回的不是最后一个元素,而是最后一个元素的下一个位置

反向迭代器:
反向迭代器和正向迭代器的返回值完全相反使用起来也是相反的操作
正常思维来说,rbegin返回的是最后一个元素的迭代器,如果想要向前访问数据,依次–操作即可,但是反向迭代器的设计异于常人,如果想要向前访问,使用的是++操作
rend返回的是第一个元素的上一个位置,如果想要向后访问,不是使用++,而是–操作
所以反向迭代器完全是和正向迭代器相反

反向迭代器的关键字是reverse_iterator
反向迭代器的定义:set<数据类型> reverse_iterator 迭代器名
rbegin(返回最后一个元素的迭代器)
rend(返回第一个元素的前一个位置)
在这里插入图片描述

set迭代器的注意事项:
在这里插入图片描述
在删除迭代器的值后,如果再次访问迭代器就会报错

map的基本使用

map的头文件:#include
map和set的区别是:set的key就是value,而map的key和value是分开的,同样key是不允许被修改的

map的构造:
在这里插入图片描述

插入:insert
在这里插入图片描述
删除:erase
在这里插入图片描述

查找:find
在这里插入图片描述
数据个数:size
清空:clear
交换:swap
以上三个接口和set的使用方法一样的,这里就不上代码了

迭代器:
map的迭代器和set的迭代器使用方法是一样的

正向迭代器:
beign(返回第一个元素的迭代器)
end(返回最后一个元素下一个位置的迭代器)
在这里插入图片描述

反向迭代器:
rbegin(返回最后一个元素下一个位置的迭代器)
rend(返回第一个元素的上一个位置的迭代器)
在这里插入图片描述

## 【重点】:[ ]的使用
在map中,可以通过[ ]来修改value的值,[ ]中填入key,即可找到value
在这里插入图片描述
这里再说一个有意思的操作,使用[ ]插入:
在这里插入图片描述
【说明】:使用[ ]插入,如果插入的key已经存在,则会修改value 的值,如果不存在,则将key和value插入
在这里插入图片描述

我们来做一个简单的题目:统计数组中水果出现的次数
在这里插入图片描述
这里是用[ ]来计算是不是特别的巧妙

multimap和multiset

其实multi系列的容器没什么好说的,看一下文档介绍吧

  1. multiset是按照特定顺序存储元素的容器,其中元素是可以重复的。

  2. 在multiset中,元素的value也会识别它(因为multiset中本身存储的就是<value, value>组成
    的键值对,因此value本身就是key,key就是value,类型为T). multiset元素的值不能在容器
    中进行修改(因为元素总是const的),但可以从容器中插入或删除。

  3. 在内部,multiset中的元素总是按照其内部比较规则(类型比较)所指示的特定严格弱排序准则
    进行排序。

  4. multiset容器通过key访问单个元素的速度通常比unordered_multiset容器慢,但当使用迭
    代器遍历时会得到一个有序序列。

  5. multiset底层结构为二叉搜索树(红黑树)。
    注意:

  6. multiset中再底层中存储的是<value, value>的键值对

  7. mtltiset的插入接口中只需要插入即可

  8. 与set的区别是,multiset中的元素可以重复,set是中value是唯一的

  9. 使用迭代器对multiset中的元素进行遍历,可以得到有序的序列

  10. multiset中的元素不能修改

  11. 在multiset中找某个元素,时间复杂度为 O ( l o g 2 N ) O(log_2 N) O(log2N)

  12. multiset的作用:可以对元素进行排序

  13. Multimaps是关联式容器,它按照特定的顺序,存储由key和value映射成的键值对<key,
    value>,其中多个键值对之间的key是可以重复的。

  14. 在multimap中,通常按照key排序和惟一地标识元素,而映射的value存储与key关联的内
    容。key和value的类型可能不同,通过multimap内部的成员类型value_type组合在一起,
    value_type是组合key和value的键值对:
    typedef pair<const Key, T> value_type;

  15. 在内部,multimap中的元素总是通过其内部比较对象,按照指定的特定严格弱排序标准对
    key进行排序的。

  16. multimap通过key访问单个元素的速度通常比unordered_multimap容器慢,但是使用迭代
    器直接遍历multimap中的元素可以得到关于key有序的序列。

  17. multimap在底层用二叉搜索树(红黑树)来实现。
    注意:multimap和map的唯一不同就是:map中的key是唯一的,而multimap中key是可以
    重复的。

multimap的使用
multimap中的接口可以参考map,功能都是类似的。
注意:

  1. multimap中的key是可以重复的。
  2. multimap中的元素默认将key按照小于来比较
  3. 使用时与map包含的头文件相同:

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

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

相关文章

【Qt专栏】实现单例程序,禁止程序多开的几种方式

目录 一&#xff0c;简要介绍 二&#xff0c;实现示例&#xff08;Windows&#xff09; 1.使用系统级别的互斥机制 2.通过共享内存&#xff08;进程间通信-IPC&#xff09; 3.使用命名互斥锁&#xff08;不推荐&#xff09; 4.使用文件锁 5.通过网络端口检测 一&#xf…

visual studio 2022.NET Core 3.1 未显示在目标框架下拉列表中

问题描述 在Visual Studio 2022我已经安装了 .NET core 3.1 并验证可以运行 .NET core 3.1 应用程序&#xff0c;但当创建一个新项目时&#xff0c;目标框架的下拉列表只允许 .NET 6.0和7.0。而我在之前用的 Visual Studio 2019&#xff0c;可以正确地添加 .NET 核心项目。 …

Dev-C++ 下载和安装

TOC 1. 下载 Dev-C 访问 sourceforge 网站&#xff0c;然后单击 Download&#xff0c; 2. 安装 Dev-C 双击下载的安装文件进行安装。 3. 在线环境 https://cpp.sh/ 完结&#xff01;

IDEA中GIT相关操作

文章目录 IDEA中GIT相关操作IDEA TAG 提交查看某个tag版本代码、根据某个tag创建分支将分支代码合并到主分支 IDEA中GIT相关操作 IDEA TAG 提交 1.创建tag 右键项目&#xff0c;然后按照 Git -> Repository -> Tag… 创建tag。 或 顶部菜单栏 按照 VCS -> Git->…

27- v-model 原理 组件应用

v-model 原理 原理: V-model本质上是一个语法糖。例如应用在输入框上&#xff0c;就是 value属性 和 input事件 的合写 作用: 提供数据的双向绑定 (1) 数据变,视图跟着变 : value (2) 试图变,数据跟着变: input 注意: $event 用于在模板中, 获取事件的形参 <template>…

YOLOv5算法改进(5)— 添加ECA注意力机制

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。ECA注意力机制是一种用于图像处理中的注意力机制&#xff0c;是在通道注意力机制的基础上做了进一步的改进。通道注意力机制主要是通过提取权重&#xff0c;作用在原特征图的通道维度上&#xff0c;而ECA注意力机制则使用了…

人力资源小程序的设计方案与实现

随着互联网的发展&#xff0c;人才招聘已经成为许多企业的一项重要任务。为了提高招聘效率和便利求职者&#xff0c;许多企业开始采用小程序作为招聘平台。本文将为大家介绍一个搭建本地人才招聘网小程序的实用指南。 首先&#xff0c;我们需要登录【乔拓云】制作平台&#xff…

信创国产系统麒麟arm架构中nginx安装过程

前言 在事业单位或国企&#xff0c;信创项目在步步推进&#xff0c;下面将在国产系统通信arm架构中nginx的安装过程记录分享出来&#xff0c;希望帮助到有需要的小伙伴。 1、nginx下载 1.1、在线下载 进入指定目录&#xff0c;如/usr/local&#xff0c;执行如下命令&#x…

DataFrame.plot函数详解(二)

DataFrame.plot函数详解&#xff08;二&#xff09; 1. Line 1.1主要参数 import matplotlib.pyplot as plt import pandas as pd import numpy as npdf pd.Series(abs(np.random.randn(10)), index pd.date_range(2020-01-01, periods 10)) df.plot.line(style :,marker…

【51单片机】EEPROM-IIC实验(按键控制数码管)

目录 &#x1f381;I2C总线 ​编辑 &#x1f381;代码 &#x1f3f3;️‍&#x1f308;main.c &#x1f3f3;️‍&#x1f308;i2.c &#x1f386;代码分析 &#x1f381;I2C总线 I2C总线是Philips公司在八十年代初推出的一种串行、半双工的总线&#xff0c;主要用于近距…

xsschallenge通关(1-10)

文章目录 level1level 2level 3level 4level 5level 6level 7level 8level9level 10 level1 这一关很简单&#xff0c;标准的xss注入&#xff0c;打开hackbar&#xff0c;输入 <script>alert(/xss/)</script>点击EXECUTE&#xff0c;通关&#xff01; level 2 这…

HTML <template> 标签

实例 使用 <template> 保留页面加载时隐藏的内容。使用 JavaScript 来显示: <button οnclick="showContent()">显示被隐藏的内容</button><template><h2>Flower</h2><img src="img_white_flower.jpg" width=&q…

微服务框架 go-zero 快速实战

对于咱们快速了解和将 go-zero 使用起来&#xff0c;我们需要具备如下能力&#xff1a; 基本的环境安装和看文档的能力 Golang 的基本知识 Protobuf 的基本知识 web&#xff0c;rpc 的基本知识 基本的 mysql 知识 其实这些能力&#xff0c;很基础&#xff0c;不需要多么深入&a…

MAE 论文精读 | 在CV领域自监督的Bert思想

1. 背景 之前我们了解了VIT和transformer MAE 是基于VIT的&#xff0c;不过像BERT探索了自监督学习在NLP领域的transformer架构的应用&#xff0c;MAE探索了自监督学习在CV的transformer的应用 论文标题中的Auto就是说标号来自于图片本身&#xff0c;暗示了这种无监督的学习 …

15 html简介

文章目录 html 概述和基本结构html概述html的基本结构HTML 文档类型xhtml 1.0 &#xff08;html4&#xff09;html5 两种文档的区别html 注释 html标签介绍html 标题标签html 段落标签、换行标签与字符实体html 段落标签html 换行标签html 字符实体 html 块标签、含样式的标签h…

28- .sync修饰符:父子双向绑定

作用: 可以实现 子组件 与 父组件数据 的 双向绑定&#xff0c;简化代码 特点: prop属性名&#xff0c;可以自定义&#xff0c;非固定为 value 场景: 封装弹框类的基础组件&#xff0c;visible属性 true显示 false隐藏 本质: 就是 :属性名 和 update:属性名 合写

打开软件提示msvcp140.dll丢失的解决方法,msvcp140主要丢失原因

今天&#xff0c;我将为大家介绍一种非常常见的问题——msvcp140.dll丢失。这个问题可能会导致许多应用程序无法正常运行&#xff0c;甚至崩溃。但是&#xff0c;请不要担心&#xff0c;我会为大家提供5种解决方法&#xff0c;帮助大家轻松解决问题。 首先&#xff0c;我们来看…

Android 13 - Media框架(8)- MediaExtractor

上一篇我们了解了 GenericSource 需要依赖 IMediaExtractor 完成 demux 工作&#xff0c;这一篇我们就来学习 android media 框架中的第二个服务 media.extractor&#xff0c;看看 IMediaExtractor 是如何创建与工作的。 1、MediaExtractorService media.extractor 和 media.p…

【ArcGIS微课1000例】0071:普通最小二乘法 (OLS)回归分析案例

严重声明:本文来自专栏《ArcGIS微课1000例:从点滴到精通》,为CSDN博客专家刘一哥GIS原创,原文及专栏地址为:(https://blog.csdn.net/lucky51222/category_11121281.html),谢绝转载或爬取!!! 文章目录 一、空间自回归模型二、ArcGIS普通最小二乘法回归(OLS)一、空间自…

企业ADManager Plus软件的使用案例

引言&#xff1a; 在当今数字化时代&#xff0c;企业的活动主要依赖于信息技术和计算机系统。作为关键的IT基础架构组件之一&#xff0c;Active Directory&#xff08;AD&#xff09;在维护和管理用户、计算机和资源方面发挥着关键作用。AD的高效管理对于确保企业的平稳运行至…