map与set详解

news2024/11/19 9:22:17

🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸
在这里插入图片描述

文章目录

  • 一、两个概念
  • 二、set
    • ①set的两种遍历方式
    • ②set的erase
    • ③set的count
  • 三、map
    • ①SGI-STL中关于键值对的定义
    • ②map的insert
    • ③访问键值对
    • ④map的operator->
    • ⑤map的operator[]
    • ⑥map的at

一、两个概念

序列是容器:
在初阶阶段,已经接触STL的部分容器,vector,list,deque,forward_list等等,这些都哦是序列是容器,因为其底层为线性序列的数据结构,里面存的是元素本身,那么什么是关联式容器?

关联式容器:
也是用来存储数据的,与序列式容器不同的是,其里面村的是<Key,Value>这样结构的键值对,在数据检索时效率更高

二、set

在这里插入图片描述

①set的两种遍历方式

首先,set是Key的模型,不允许修改,所以set只有增删查

//初始化
set<int> s={1,2,1,6,3,8,5};
//可以这样进行初始化,这个是C++11中的列表初始化
//initializer_list
int a[] = (1,2,1,6,3,8,5);
set<int>s(a,a+sizeof(a)/sizeof(int));

//第一种
set<int>::iterator  it = s.begin();
while(it!=s.end())
{
	cout<<*it;
	it++;
}

//第二种
for(auto k:s)
{
	cout<<k;
}

但是范围for是用迭代器实现的,所以这严格来说只能算是一种遍历方式

set的地曾是一可红黑树(红黑树也是搜索二叉树),set间接可以完成的任务就是排序+去中,然后真正干的事就是去找在不在

迭代器也是一种设计模式,访问容器,在没有暴露容器的底层结构的前提下提供了统一的访问方式,哪怕他是红黑树,所以迭代器是很牛的,这也让他成为了STL六大组件之一

②set的erase

//1.
s.erase(x);//某个数

//2.
auto pos = s.find(x);//找到某个数位置
s.erase(pos);

需要注意的是,我们在实际使用过程当中,我们需要把所有容器的erase都当作迭代器已经失效来看待,每一次的erase都要重新去更新迭代器的位置。避免迭代器失效而奔溃

//1.erase提供下一个位置迭代器,直接用
while(...)
{
	pos = s.erase(x);
}
//2.不断的find
pos = s.find(x);
s.erase(pos);
pos = s.find(y);
...

③set的count

count的作用是计数set当中的该键值个数,但是搜索二叉树/红黑树本来就不允许键值冗余,set当中留一个count来干嘛,结果不都是0/1吗,我为什么不用find?
因为count是为了接口一致性的问题,除了set外,还有一个multimap,它是允许键值冗余的

三、map

在这里插入图片描述

①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的insert

map需要插入的是一个pair结构体,底层也是红黑树

//插入方法
map<string,string> dict;
//1.
pair<string,string> kv1("sort","排序");
dict.insert(kv1);
//2.
dict.insert(pair<string,string>("zhupi","帅哥"));
//3.
typedef pair<string,string> DictKV;
dict.insert(DictKV("zhupi","帅哥"));
//4.make_pair
dict.insert(make_pair("zhupi","帅哥"));
//5.列表初始化
dict.insert({"zhupi","帅哥"});

而对于make_pair,其实就是一个函数模板,优势就是自动推导,需要包含头文件utility,实用工具
在这里插入图片描述
而且呢,这种短代码一般定义成内联,在预编译阶段就会被替换

③访问键值对

//map<string,string>::iterator it = dict.begin();
auto it = dict.begin();
//错误写法
while(it!=dict.end())
{
	cout<<*it<<" ";
	++it;
}
cout<<endl;

上面这样写是不行的,通过上面键值对pair的定义我们可以看出,他是一个结构体,但是ostream类中并没有重载关于pair<string,string>的重载。所以我们需要通过以下方式进行访问

//1.
while(it!=dict.end())
{
	cout<<(*it).first<<(*it).second<<endl;
	++it;
}

//2.先看下面的operator->
while(it!=dict.end())
{
	cout<< it -> first << it -> second <<endl;
	++it;
}

④map的operator->

Ptr/*模板参数*/ operator->()
{
	return &(*this);
}

这一步的操作是为了从迭代器转换为单纯的指针,因为迭代器是一层封装,我们无法拿到底层的结。
而当我们使用it->first的时候,它其实是it->->first,第一个代表转换为纯指针,第二个才代表拿到pair中的first,只不过编译器为了可读性把他弄成一个

⑤map的operator[]

在这里插入图片描述
map的[]已经有点违背之前使用string和vector的伊斯兰,之前的目的的下标随机访问,得益于底层空间的连续,但是map是红黑树

operator[]的作用是通过Key找到对应的Value
1.map中没有这个key,则插入一个pair<Key,V()>,后面的是value的匿名对象,因为V可能是自定义类型,所以int也有了int(),默认是0.插入之后,返回Value的引用
2.map中有这个key,返回value的引用

我们来看看库中的写法

//已简化
V& operator[](const K& key)
{
    pair<iterator,bool> ret=insert(make_pair(Key,Value));
    //因为insert返回的是一个pair<iterator,bool>;
    //insert返回的是一个pair<iterator,bool>
    //第一个参数的second就是value,
    //第二个参数代表是新插入true还是本来就在false
    return ret.first->second;
    //ret是一个pair结构体,ret.first就是迭代器,然后(*(ret.first)).second或者(ret.first)->second
}

⑥map的at

at与operator[]来说,就少了一个功能
at只能够查找+修改
也就是说,如果key在,那么返回value的引用
如果不再,那么我就抛异常

在这里插入图片描述

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

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

相关文章

docker redis容器化(极简教程)

1.通过redis-cli连接你原来的redis&#xff0c;进入后输入info&#xff0c;查看到具体版本号 2.下载redis官方镜像,docker pull redis:你的版本号 3.创建一个新文件夹redis&#xff0c;mkdir -r /hadoop/redis 4.复制你原来的redis.conf&#xff0c;到redis文件夹中,cp /usr/l…

c语言 指针进阶5 6 自定义冒泡函数 qsort

指向函数指针数组的指针 回调函数 如何使用 一个函数可以实现加减乘除 calc&#xff08;&#xff09; 不同点通过函数参数传进去 代码解释如下 int Add(int x, int y) {return x y; } int Sub(int x, int y) {return x - y; } int Mul(int x, int y) {return x * y; } in…

JDBC -- API

目录 DriverManager 驱动管理类 作用 注册驱动 获取数据库连接 Connection 数据库连接对象 作用 获取执行SQL的对象 管理事务 Statement 作用 执行SQL语句 ResultSet 结果集对象 作用 封装了DQL查询语句的结果 获取查询结果 PreparedStatement 作用 预编译SQ…

C#大型医院HIS系统源码 医院信息管理系统源码 C/S架构 VS2013+sql2012

了解更多源码内容&#xff0c;可私信我。 开发环境&#xff1a;VS2013sql2012 C/S架构 一、门诊系统&#xff1a; 1、挂号与预约系统:实现了医院门诊部挂号处所需的各种功能&#xff0c;包括门诊安排的管理&#xff0c;号表的生成及维护&#xff0c;门诊预约管理和挂号处理&…

6. SSM整合

1. SSM整合配置 SM整合流程 创建工程SSM整合 Spring SpringConfig MyBatis MybatisConfigJdbcConfigjdbc.properties SpringMVC ServletContainerInitConfigSpringMvcConfig 1.1 创建工程&#xff0c;添加依赖和插件 <dependencies><dependency><groupId&g…

【LeetCode】解数独 [H](深度优先遍历)

37. 解数独 - 力扣&#xff08;LeetCode&#xff09; 一、题目 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只…

设计模式-责任链模式

一、知其然 责任链字面含义第一联想到的就是他是一个链式的行为&#xff0c;就像一个链条一样把所产生的动力传输到到齿轮上一样&#xff1b;还有类似生活中的一个游戏“击鼓传花”&#xff0c;这样说好像也是泛泛而谈&#xff0c;来看看度娘的官方概念&#xff08;摘自百度百科…

[每周一更]-(第26期):反爬虫机制

随着网站的越来越普及&#xff0c;我们开发出来的知识类网站更不希望被竞争对手爬虫&#xff0c;虽然现在网络中充斥着各种各样的蜘蛛&#xff0c;有合法的浏览器爬虫&#xff0c;以及不合法 的人为爬虫&#xff0c;所以攻防战一直都存在&#xff0c;我们只能更好的设定规则&am…

中文文本分类

手把手带你做一个文本分类实战项目(模型代码解读) https://www.bilibili.com/video/BV15Z4y1S7aR/?spm_id_from333.788.recommend_more_video.-1&vd_sourcec47fbb8166930edc486d8fdc405bf569 中文汉字对应的数字索引 之后对应的数字索引 之后找到tokn embedding的东西 1…

34. 池化层 / 汇聚层

1. 池化层 如果我们拍摄黑白之间轮廓清晰的图像X&#xff0c;并将整个图像向右移动一个像素&#xff0c;即Z[i, j] X[i, j 1]&#xff0c;则新图像Z的输出可能大不相同。而在现实中&#xff0c;随着拍摄角度的移动&#xff0c;任何物体几乎不可能发生在同一像素上。即使用三脚…

15【SpringMVC的注解开发】

文章目录二、SpringMVC注解支持2.1 回顾Servlet容器启动源码流程2.2 分析SpringMVC启动源码分析2.2.1 SpringServletContainerInitializer源码分析2.2.2 WebApplicationInitializer源码分析1&#xff09;AbstractContextLoaderInitializer2&#xff09;AbstractDispatcherServl…

短视频播放量超10w后,流量变少的问题解决方案

短视频播放量超10w后&#xff0c;流量变少的问题解决方案 上一篇我们聊了视频播放超10w后&#xff0c;会遇到流量变少的问题并分析了可能的原因&#xff0c;既然知道了原因&#xff0c;那么我们就可以针对性的去解决了。 今天给大家聊一聊在我赢助手跟超200名短视频创作者沟通…

Allegro如何设置差分动态等长规则操作指导

Allegro如何设置差分动态等长规则操作指导 Allegro上可以对差分设置动态等长规则,让差分对在任意一段距离上都是满足等长误差的,尤其是在差分对走线较长的情况下 以下面这两对线为例 具体操作如下 打开constraint Manage选择Physical规则

Linux 管理联网 设置主机名( nmtui图形化 和 hostnamectl命令 )

设置主机名 # 常用的有两种方式&#xff0c;一种是 nmtui 图形化界面的方式来设置&#xff0c; 一种是 hostnamectl 命令的方式来设置。 nmtui 直接在命令行 输入 nmtui 便进入 图形化界面 >>> 最后一选项&#xff08; 红底&#xff09; 便是 设置主机名~&#x…

微导纳米科创板上市:市值125亿 无锡首富王燕清再敲钟

雷递网 雷建平 12月23日江苏微导纳米科技股份有限公司&#xff08;简称&#xff1a;“微导纳米”&#xff0c;股票代码为&#xff1a;“688147”&#xff09;今日在科创板上市。微导纳米此次发行4544.55万股&#xff0c;发行价为24.21元&#xff0c;募资总额为11亿元。微导纳米…

react笔记_11 redux

目录redux定义使用时机redux基本概念StoreStateActionreducerredux工作原理语法[1] 创建StorecreateStorecombineReducers[2]创建并分发actiondispatchapplyMiddleware语法举例说明- 做一个加法运算执行原理redux-thunk中间件使用[3]创建reducer语法渲染过程[4]getState[5]subs…

基于meanshift算法的目标聚类和目标跟踪matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 meanshift算法其实通过名字就可以看到该算法的核心&#xff0c;mean&#xff08;均值&#xff09;&#xff0c;shift&#xff08;偏移&#xff09;&#xff0c;简单的说&#xff0c;也就是有一个…

Web前端105天-day63-HTML5_CORE

HTML5CORE03 目录 前言 一、复习 二、SVG 三、Echarts 四、Webworker 五、回调地狱 六、Promise 七、promiseajax 八、promise_axios 九、async_await 总结 前言 HTML5CORE03学习开始 一、复习 跨域 浏览器的同源策略限定: 网页中利用 AJAX 请求数据, 必须访问同源…

【CSS】flex布局用法解析,快速上手flex布局,flex:1是什么意思?肯定看的懂好吧?

一、flex布局 flex 是 flexible box 的缩写&#xff0c;意为"弹性布局"&#xff0c;用来为盒状模型提供最大的灵活性。 任何一个容器都可以指定为 flex 布局。 采用 flex 布局的元素&#xff0c;称为 flex 容器&#xff08;flex container&#xff09;&#xff0c;…

如何解决跨越

解决跨域我想在坐的各位都会听说过几个解决跨域的方法&#xff1a; 1.有什么 cors后端配置&#xff08;加几个请求头 2.jsonp&#xff08;利用script的src属性&#xff09; 3.还有vue-cli前端配置。 跨域其实就是违背了浏览器的一种策略&#xff0c;这种策略就是同源策略&…