STL——map和set

一、set的介绍

1、set是按照一定次序存储元素的容器;

2、在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的,set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们;

3、set在底层是用二叉搜索树(红黑树)实现的;

4、set中的元素默认按照小于来比较;

5、set中查找某个元素,时间复杂度为:O(log2N);

set的一些接口函数可自行查看文档来使用 set - C++ Reference (cplusplus.com)

这里需要了解一下insert()函数:

pair<iterator,bool> insert (const value_type& val);

1、key已经在树里面,返回pair<树里面key所在节点的iterator, false>;

2、key不在树里面,返回pair<新插入树中key所在节点的iterator, true>;

pair是一个类模板: 

我们删除set节点的时候,可以传一段迭代器区间,可以用以下三个函数来找迭代器区间的范围。

1、lower_bound(找左边界)

找大于等于val的第一个值;

2、upper_bound(找右边界)

找大于val的第一个值;

因为erase()传的是一个左闭右开的区间,举个例子:

int main ()
{set<int> myset;set<int>::iterator itlow,itup;for (int i=1; i<10; i++) myset.insert(i*10); // 10 20 30 40 50 60 70 80 90//要删除[30, 60]的值itlow=myset.lower_bound (30);itup=myset.upper_bound (60);//[30, 70)myset.erase(itlow,itup);//左闭右开            // 10 20 70 80 90return 0;
}

3、equal_range

void setTest2()
{multiset<int> s;s.insert(1);s.insert(2);s.insert(4);s.insert(2);s.insert(2);s.insert(3);s.insert(2);s.insert(5);for (auto e : s){cout << e << " ";}cout << endl;auto ret = s.equal_range(2);auto itlow = ret.first;auto itup = ret.second;cout << *itlow << endl;cout << *itup << endl;s.erase(itlow, itup);for (auto e : s){cout << e << " ";}cout << endl;
}

运行结果:

二、map的介绍

1、 map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元
素;

2、在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名称为pair:typedef pair<const key, T> value_type;

我们已经在上面介绍了pair

3、map支持下标访问符,即在[]中放入key,就可以找到与key对应的value;
4、map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。

map的一些接口函数可自行查看文档来使用 map - C++ Reference (cplusplus.com)

map和set大致上是一样的,都是红黑树,但是map节点存的是键值对,即一个key和其对应的信息,map中重点要理解 [] 的使用。

operator[]里面调用了insert函数,而insert函数上面已经介绍了;

更容易理解的来说,调用operator[]就是传过去一个key,返回这个key对应的value的引用。

例如:之前统计水果出现的次数和实现类似字典的程序都可以使用operator[]

void map_test2()
{string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜","苹果", "香蕉", "苹果", "香蕉" };map<string, int> countmap;//方法一:/*for (auto s : arr){map<string, int>::iterator it = countmap.find(s);if (it == countmap.end()){countmap.insert(make_pair(s, 1));}else{it->second++;}}*///方法二:for (auto s : arr){countmap[s]++;}map<string, int>::iterator it = countmap.begin();while (it != countmap.end()){cout << it->first << ":" << it->second << endl;++it;}cout << endl;
}

void map_test3()
{map<string, string> dict;dict.insert(make_pair("car", "汽车"));dict.insert(make_pair("football", "足球"));dict.insert(make_pair("red", "红色"));cout << dict["car"] << endl;//查找,显示dict["black"];//插入dict["football"] = "kkk";//修改dict["green"] = "绿色";//插入+修改cout << dict["black"] << endl;cout << dict["football"] << endl;}

总结:

1、map中的的元素是键值对;
2、map中的key是唯一的,并且不能修改;
3、默认按照小于的方式对key进行比较;
4、map中的元素如果用迭代器去遍历,可以得到一个有序的序列;
5、map的底层为平衡搜索树(红黑树),查找效率比较高O(log2 N);
6、支持[]操作符,operator[]中实际进行插入查找。

三、multimap和multiset

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

multimap和map的唯一不同就是:map中的key是唯一的,而multimap中key是可以重复的。

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

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

相关文章

燃气管网监测系统,24小时守护燃气安全

随着社会的发展和人民生活水平的提高&#xff0c;燃气逐渐成为人们日常生活和工作中不可或缺的一部分。然而&#xff0c;近年来&#xff0c;屡屡发生的燃气爆炸问题&#xff0c;也让人们不禁对燃气的安全性产生了担忧。因此&#xff0c;建立一个高效、实时、准确的燃气管网监测…

开始MySQL探索——数据库概述

计算机语言 计算机语言概述 计算机语言&#xff08;Computer Language&#xff09;可以简单的理解为一种计算机和人都能识别的语言。 机器语言 汇编语言 高级语言 机器语言 汇编语言 高级语言 SQL语言基础 SQL的概述 SQL全称&#xff1a;Structured Query Language&…

ubuntu18.04复现yolo v8环境配置之CUDA与pytorch版本问题以及多CUDA版本安装及切换

最近在复现yolo v8的程序&#xff0c;特记录一下过程 环境&#xff1a;ubuntu18.04ros melodic 小知识&#xff1a;GPU并行计算能力高于CPU—B站UP主说的 Ubuntu可以安装多个版本的CUDA。如果某个程序的Pyorch需要不同版本的CUDA&#xff0c;不必删除之前的CUDA&#xff0c;…

2022年30m全国逐年土地覆被数据

1.研究背景 2023年8月,武汉大学杨杰和黄昕教授团队向公众更新发布了CLCD 2022年全国土地覆数据(V1.0.2)。而CLCD 2021年全国土地覆数据(V1.0.1)也是在去年8月向公众更新发布。 中国在过去几十年中经济和人口迅速发展,土地覆盖随之发生巨大变化,因此迫切需要对其进行连续…

【启明智显分享】原来洗衣机还可以如此进行产品升级!

洗衣机是我们日常生活中必不可少的家电之一&#xff0c;而随着科技的不断进步&#xff0c;洗衣机也在不断进行创新和升级&#xff0c;以提供更好的用户体验和功能。 而今天&#xff0c;我们要介绍的就是一种创新的洗衣机方案&#xff0c;即将3.5寸串口屏应用于洗衣机中&#x…

Java算法_ BST 中第 k 个最小元素 (LeetCode_Hot100)

题目描述&#xff1a;给定一个二叉搜索树的根节点 &#xff0c;和一个整数 &#xff0c;请你设计一个算法查找其中第 个最小元素&#xff08;从 1 开始计数&#xff09;。 获得更多&#xff1f;算法思路:代码文档&#xff0c;算法解析的私得。 运行效果 完整代码 /*** 2 * Aut…

Hugo托管到Github Pages

Github通过其Github Pages服务可以user、project或organization提供免费快速的静态托管&#xff0c;同时使用Github Actions自动化开发工作流和构建。 1.创建Github仓库 可见性为public。 命名为username.github.io&#xff0c;username为你的Github用户名。 2.添加远程仓库…

[docker][WARNING]: Empty continuation line found in:

报警内容&#xff1a; 下面展示一些 内联代码片。 //执行 sudo docker build ubuntu:v1.00 . [WARNING]: Empty continuation line found in:出现上述错误原因为18行多了一个 " \" 符号&#xff0c;去除即可

cuda面试准备(一),架构调试

1 cuda架构 硬件方面 SP (streaming Process) ,SM (streaming multiprocessor) 是硬件(GPUhardware) 概念。而thread,block,grid,warp是软件上的(CUDA) 概念 SP:最基本的处理单元,streaming processor,也称为CUDA core,最后具体的指令和任务都是在SP上处理的。GPU进行并行…

Unity 之`Physics.Raycast()`方法,射线检测

文章目录 总述参数解释形参前两个变量可以用Ray 来代替 返回值 总述 当你在Unity中使用Physics.Raycast()方法时&#xff0c;你实际上是在进行一种射线检测&#xff0c;以查看一条射线是否与场景中的碰撞体相交。这可以用来实现很多不同的功能&#xff0c;如点击选择物体、射击…

【Flutter】Flutter 使用 device_info_plus 获取设备的制造商、型号等信息

【Flutter】Flutter 使用 device_info_plus 获取设备的制造商、型号等信息 文章目录 一、前言二、安装和基本使用三、实际业务中的用法四、完整示例五、总结 一、前言 在这篇博客中&#xff0c;我将为你介绍一个非常实用的 Flutter 插件&#xff1a;device_info_plus。这个插件…

ESP32应用教程(1)— VL53L3CX距离传感器

文章目录 前言 1 产品概述 1.1 技术规格 1.2 系统框图 1.3 设备引脚分布 2 工作流程 2.1 系统功能描述 2.2 状态机描述 2.3 测距模式说明 3 控制接口 3.1 设备地址 3.2 IC写1个字节数据 3.3 IC读1个字节数据 3.4 IC写多个字节数据 3.5 IC读多个字节数据 3.6 IC…

本地编译angular提示内存溢出

本地遇到编译angular时&#xff0c;报如下错误&#xff1a; FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory 两种解决办法&#xff0c;具体如下&#xff1a; 设置环境变量&#xff0c;见图&#xff1a; 直接在…

Wireshark数据抓包分析之互联网控制报文协议_ICMP

一、实验目的: 通过使用wireshark抓取的ICMP数据包对这个ICMP控制报文进行分析 二、预备知识&#xff1a; 1.ICMP协议概述&#xff1a;ICMP是Internet Control Message Protocol的缩写&#xff0c;即互联网控制报文协议。它是TCP/IP协议族的一个子协议&#xff0c;用于IP主机、…

抖音web主页视频爬虫

需要抖音主页视频爬虫源码的发私信&#xff0c;小偿即可获得长期有效的采集程序。 比构造 s_v_web_id 验证滑块的方法更快&#xff0c;更稳定。

用pytorch实现Resnet

ResNet&#xff08;Residual Network&#xff09;是一种深度卷积神经网络架构&#xff0c;由Kaiming He等人于2015年提出。它在计算机视觉领域引起了革命性的变革&#xff0c;使得训练更深的神经网络成为可能&#xff0c;超越了传统网络架构的限制。 ResNet的主要创新在于…

LeetCode——二叉树篇(九)

刷题顺序及思路来源于代码随想录&#xff0c;网站地址&#xff1a;https://programmercarl.com 目录 669. 修剪二叉搜索树 108. 将有序数组转换为二叉搜索树 538. 把二叉搜索树转换为累加树 669. 修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界…

前端需要理解的数据治理与异常监控知识

1 数据治理 前端数据治理的重要指标是准确性和数据&#xff0c;一个数据对象包括数据值和其他元数据。 2 数据上报方式 2.1 Image 通过将采集的数据拼接在图片请求的后面&#xff0c;向服务端请求一个 1*1 px 大小的图片&#xff08;gif&#xff09;实现的&#xff0c;设置…

python3高级编程

文章目录 1. Python网络编程1.1 服务器端代码(Server)1.2 客户端代码(Client) 2. 多线程2.1 线程模块2.2 使用 threading 模块创建线程2.3 线程同步2.4 线程优先级队列&#xff08; Queue&#xff09; 3. 日期和时间4. SMTP发送邮件4.1 使用Python发送HTML格式的邮件4.2 Python…

WPF基础入门-Class1-布局

WPF基础入门 Class1&#xff1a;布局 1、Grid行列结构 *:按比例设置宽高&#xff0c;eg:0.6* <Grid><!--两行两列--><Grid.RowDefinitions><RowDefinition Height"*"></RowDefinition><RowDefinition></RowDefinition>…