C++——STL容器【map和set】

在这里插入图片描述

文档:map、set

文章目录

  • 🍯1. 关联式容器
  • 🫖2. set
    • 🍼1. 模板参数
    • 🍼2. 构造函数
    • 🍼3. 修改
    • 🍼4.操作
      • 🥛find
      • 🥛count
      • 🥛lower_bound & upper_bound & equal_range
  • 🍭3. map
    • 🍬1. 模板参数
    • 🍬2. 构造函数
    • 🍬3. insert
    • 🍬4. operator[]
    • image-20230906114657420

🍯1. 关联式容器

前几篇文章中写的STL容器:vectorlistdequeue等都是序列式容器,它们都是线性结构;而mapset都是关联式容器,与序列式容器不同的是,它们里面存储的是<key,value>结构的键值对,这个在数据检索的时候,比序列式容器的效率更高

键值对:

键值对用来表示一一对应的关系结构,key表示键值,value表示与key对应的信息

template <class T1, class T2>
struct pair
{typedef T1 first_type;typedef T2 second_type;T1 first;	//keyT2 second;	//valuepair(): first(T1()), second(T2()){}pair(const T1& a, const T2& b): first(a), second(b){}
};

🫖2. set

set是一种key模型,可用于判断元素在不在、元素去重

🍼1. 模板参数

template < class T,                        // set::key_type/value_typeclass Compare = less<T>,        // set::key_compare/value_compareclass Alloc = allocator<T>      // set::allocator_type> class set;

这里的模板参数里面多了一个Compare = less<T>,它的底层是红黑树,可以用来给我们比较大小

🍼2. 构造函数

image-20230906114958645

🍼3. 修改

这些就和之前的容器使用差不多,这里就不再过多赘述了

image-20230906100230529

🍼4.操作

🥛find

iterator find (const value_type& val) const;

如找到了,返回一个它的迭代器

代码示例:

void t_find()
{set<int> s;s.insert(9);s.insert(10);s.insert(20);s.insert(23);s.insert(9);s.insert(6);auto it = s.find(2);	//搜索树查找auto stl_it = std::find(s.begin(), s.end(), 9);	//stl提供的find暴力查找if (it != s.end())cout << "get it" << endl;elsecout << "error" << endl;if (stl_it != s.end())cout << "get it" << endl;elsecout << "error" << endl;for (auto e : s){cout << e << " ";}cout << endl;
}

如果用set查找元素,使用set提供的接口即可,如果使用库里面的查找函数,效率会比较低

另外,如果是multiset,其中有多个相同元素,则查找的是第一个中序遍历出现的元素

🥛count

size_type count (const value_type& val) const;

count是统计这个元素出现的多少次,而set只是一个key模型,用处并不是很大,但我们也可以用count来进行元素查找

void t_count()
{set<int> s;s.insert(9);s.insert(10);s.insert(20);s.insert(23);s.insert(9);s.insert(6);if (s.count(9))cout << "get it" << endl;elsecout << "error" << endl;
}

这个主要是为multiset设计的,找相同元素有多少个

🥛lower_bound & upper_bound & equal_range

iterator lower_bound (const value_type& val) const;
iterator upper_bound (const value_type& val) const;
pair<iterator,iterator> equal_range (const value_type& val) const;

lower_boundupper_boundequal_range通常用来找区间

void t_lower_upper_bound()
{set<int> s;set<int>::iterator itlow, itup;for (int i = 0; i < 10; i++){s.insert(i * 10);}for (auto e : s){cout << e << " ";}cout << endl;auto range = s.equal_range(40);//[first,secont)cout << *range.first << endl;cout << *range.second << endl;//[35,70]itlow = s.lower_bound(35);	//>=35的值itup = s.upper_bound(70);	//>70的值s.erase(itlow, itup);for (auto e : s){cout << e << " ";}cout << endl;//cout << *itlow << endl;//cout << *itup << endl;
}

这个equal_range对于set的作用并不大,这个主要是为multiset提供,可以指定删除某个值

void t_multiset()
{multiset<int> mt;mt.insert(1);mt.insert(4);mt.insert(2);mt.insert(5);mt.insert(1);mt.insert(9);mt.insert(4);for (auto e : mt){cout << e << " ";}cout << endl;//如果没有找到,返回一个不存在的区间auto range = mt.equal_range(4);mt.erase(range.first, range.second);//删除全部的4for (auto e : mt){cout << e << " ";}cout << endl;
}

🍭3. map

map<key,value>模型,接口和set类似

🍬1. 模板参数

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;

相比于set多了一个value,存储值的时候采用的是pair

	pair<const key_type,mapped_type>

key不可修改,value可以修改

🍬2. 构造函数

image-20230906115028843

🍬3. insert

参数列表:

image-20230906102352274

代码示例:

void t_map_insert()
{map<string, string> dict;pair<string, string> kv1("apple", "苹果");pair<string, string> kv2("banana", "香蕉");dict.insert(kv1);dict.insert(kv2);//匿名对象插入dict.insert(pair<string, string>("orange", "橙子"));//函数模板make_pair C++98	建议使用这个方式dict.insert(make_pair("watermelon", "西瓜"));//key相同,value不同,不插入不覆盖	只比较keydict.insert(make_pair("watermelon", "北瓜"));//C++11支持多参数构造函数隐式类型转换dict.insert({ "lemon","柠檬" });
}

make_pair函数模板

image-20230906102143819

要遍历这map,不能将迭代器直接解引用,因为它里面存了2个值,这里的排序是按照key的大小进行排序

map<string, string>::iterator it = dict.begin();
while (it != dict.end())
{cout << it->first << ":" << it->second << endl;it++;
}
//范围for
//值不可修改, map内容较复杂,传引用,减少拷贝
for (const auto& e : dict)
{cout << e.first << ":" << e.second << endl;
}

🍬4. operator[]

void t_mapCount()
{string arr[] = { "冬瓜","西瓜","南瓜","北瓜","中瓜","西瓜","西瓜","北瓜" };map<string, int> countMap;for (auto e : arr){//通过insert实现countMap[e]++;}//for (auto e : arr)//{//	map<string, int>::iterator it = countMap.find(e);//	if (it == countMap.end())	//没有出现过//	{//		countMap.insert(make_pair(e,1));//	}//	else //出现过,统计次数//	{//		it->second++;//	}//}for (const auto& e : countMap){cout << e.first << ":" << e.second << endl;}
}

这里的[]不再像之前普通的[]

image-20230906112632508

它通过key,返回value,底层调用的insert

image-20230906113537714

  1. key如果在这个树里面,返回pari<树里key所在节点的iterator,false>
  2. key不在树里面,返回pari<key所在节点的iterator,true>

所以[]可以用来进行插入操作或者是统计次数或者修改value

image-20230906114657420

mapset底层都是搜索树,随后会模拟实现,所以此篇文章只做大概的介绍

那么本期分享就到这里,我们下期再见

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java运算符

目录 一、运算符的概念 二、算数运算符 三、关系运算符 五、逻辑运算符 六、移位运算符 七、条件运算符 八、运算符的优先级 一、运算符的概念 计算机的最基本的用途之一就是执行数学运算&#xff0c;比如: 上述 和 < 等就是运算符&#xff0c;即&#xff1a;对操作…

2023年MySQL实战核心技术第二篇

目录 五 . 日志系统&#xff1a;一条SQL更新语句是如何执行的&#xff1f; 5.1 解释 5.2 重要的日志模块&#xff1a;redo log 5.2.1 解释 5.2.2 WAL&#xff08;Write-Ahead Logging&#xff09; 5.2.3 crash-safe。 5.3 重要的日志模块&#xff1a;binlog 5.3 .1 为什么会有…

存储数据恢复- raid5多块硬盘出现坏道的数据恢复案例

存储数据恢复环境&#xff1a; 某单位一台存储&#xff0c;1个机头4个扩展柜&#xff0c;有两组分别由27块和23块硬盘组建的RAID5阵列。其中由27块磁盘组建的那一组RAID5阵列崩溃&#xff0c;这组RAID5阵列存放是Oracle数据库文件。存储系统上层共划分了11个卷。 存储故障&…

利用Hutool+自定义注解实现数据脱敏

利用Hutool自定义注解实现数据脱敏 前言 我们在使用手机银行的时候经常能看到APP上会将银行卡的卡号中间部分给隐藏掉使用 ***** 来代替&#xff0c;在某些网站上查看一些业务密码时&#xff08;例如签到密码等&#xff09;也会使用 ***** 来隐藏掉真正的密码&#xff0c;那么…

重磅! AIFS+MLOps两大AI基核技术前沿洞察报告出炉!

近日&#xff0c;中国国际服务贸易交易会&#xff08;以下简称“服贸会”&#xff09;在京盛大举办&#xff0c;在服贸会“2023中国AIGC创新发展论坛”和“2023中国金融科技论坛”两大论坛的成果发布环节&#xff0c;九章云极DataCanvas公司与IDC重磅发布「AIFS人工智能基础软件…

linux安装minio以及springboot整合使用

文章目录 1.linux安装minio2.springboot整合minio使用 1.linux安装minio 1.新建文件夹 mkdir /home/minio # 数据文件夹 mkdir /home/minio/data # 创建日志文件夹 mkdir /home/minio/log2.进入文件夹 cd /home/minio3.下载minio&#xff0c;链接可从官网获取 wget https://…

.net core 上传文件大小限制

微软官网文档中给的解释是.net core 默认上传文件大小限制是30M&#xff0c;所以即便你项目里没有限制&#xff0c;这里也有个默认限制。 官网链接地址 总结了一下解决办法&#xff1a; 1.首先项目里添加一个web.config自定义配置文件 在配置文件中加上这段配置 <!--//…

MySql学习笔记03——DQL(数据查询)基本命令

DQL 导入数据 首先使用use database进入数据库中&#xff0c;然后使用命令 source D:\mysql_learning\mysql_learning\document\bjpowernode.sql注意文件名不能有双引号&#xff0c;命令结尾没有分号。 SQL脚本 .sql文件是SQL脚本文件&#xff0c;它里面的内容都是SQL语句…

【数学建模】数据预处理

为什么需要数据预处理 数学建模是将实际问题转化为数学模型来解决的过程&#xff0c;而数据预处理是数学建模中非常重要的一步。以下是为什么要进行数据预处理的几个原因&#xff1a; 数据质量&#xff1a;原始数据往往存在噪声、异常值、缺失值等问题&#xff0c;这些问题会对…

MATLAB 的 figure 用法总结

文章目录 Syntax&#xff1a;DescriptionExamples1.figure2.figure(Name,Value)Position 属性: 设置 Figure 的位置和大小Name 属性: 设置 Figure 的名称NumberTitle 属性: 取消 Figure 名称里默认的数字units 属性color 属性 3.f figure(___)4.Working with Multiple Figures…

C++ 多态语法点

前置知识点 成员变量和成员函数分开存储&#xff0c;只有非静态成员变量才属于类的对象上。 静态成员变量和静态成员函数没有在类上存储。 非静态成员函数也不属于类的对象上 class Animal {public:virtual void speak(){cout<<"动物在说话"<<endl;}}v…

sqlserver数据库链接mysql服务器访问数据

sqlserver数据库链接mysql服务器访问数据 关于SqlServer数据库怎么链接mysql数据库我一直不明白&#xff0c;今天项目碰到一个问题需要链接&#xff0c;我就研究了一下&#xff0c;然后就成功了&#xff0c;在这里记录一下。也欢迎朋友互相学习交流借鉴。 1.使用navicat打开S…

2023年信息安全管理与评估(赛项)评分标准第三阶段夺旗挑战CTF(网络安全渗透)

全国职业院校技能大赛 高职组 信息安全管理与评估 &#xff08;赛项&#xff09; 评分标准 第三阶段 夺旗挑战CTF&#xff08;网络安全渗透&#xff09; 竞赛项目赛题 本文件为信息安全管理与评估项目竞赛-第三阶段赛题&#xff0c;内容包括&#xff1a;夺旗挑战CTF&#xff08…

【LeetCode】84.柱状图中最大的矩形

题目 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释&#xff1a;最大的…

python+selenium自动化测试项目实战

说明&#xff1a;本项目采用流程控制思想&#xff0c;未引用unittest&pytest等单元测试框架 一.项目介绍 目的 测试某官方网站登录功能模块可以正常使用 用例 1.输入格式正确的用户名和正确的密码&#xff0c;验证是否登录成功&#xff1b; 2.输入格式正确的用户名和不…

C++ Opencv视频检测

使用OpenCV进行视频检测的一般步骤如下&#xff1a;导入OpenCV库和视频文件。 对每一个视频帧进行对象检测。可以使用诸如Haar特征分类器、Cascade分类器或深度学习模型等技术进行对象检测。 #include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> …

安防视频监控/视频汇聚平台EasyCVR服务重启,海康SDK设备无法上线是什么原因?

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。旭帆科技平台既具备传统安防视频监控…

MybatisPlus框架教程:入门、条件构造器、接口操作、代码生成器

MybatisPlus框架 文章目录 MybatisPlus框架快速上手条件构造器接口基本操作新版代码生成器 前面我们体验了JPA带来的快速开发体验&#xff0c;但是我们发现&#xff0c;面对一些复杂查询时&#xff0c;JPA似乎有点力不从心&#xff0c;反观稍微麻烦一点的Mybatis却能够手动编写…

el-dialog设置高度、使用resetFields清除表单项无效问题

初学者容易踩坑的的el-dialog、el-form问题 1. el-dialog设置高度2. el-form中表单项对不齐3. 使用resetFields清除表单项无效 1. el-dialog设置高度 在el-dialog中里面添加一个div设置固定高度&#xff0c;或者限制最小的高度。 <el-dialogtitle"选择图标"v-mod…

数据结构 - 单链表

文章目录 目录 文章目录 一、什么是链表? 线性表: 顺序表: 二、链表的分类和实现 分类: 实现: 1.创建节点类 2.创建单链表 1.addTail(尾增) 2.删除节点值为key的第一个节点 3.插入节点(在指定位置) 4.获取链表长度 总结 前言 大家好,这篇博客给大家讲一下什么是…