map和set关联式容器特性(课堂笔记)

map和set都是关联式容器,它们有一些共同的特性:

1. 存储方式:map和set都是基于红黑树(Red-Black Tree)实现的,这使得它们内部的元素是有序的,根据特定的排序准则进行排列。

2. 唯一性:set中的元素是唯一的,任何两个元素之间都不相等。而在map中,每个键都是唯一的。

3. 查找效率:由于内部使用了红黑树实现,map和set都具有较高的查找效率,时间复杂度为O(log n)。

4. 插入和删除操作:对于插入和删除操作,同样由于红黑树的特性,map和set的操作效率也较高,时间复杂度也为O(log n)。

5. 没有随机访问:与vector和deque不同的是,map和set不支持通过下标随机访问元素,因为元素是按照排序规则存储的。

总的来说,map和set是高效的关联式容器,适合在需要进行快速查找、插入和删除操作,并且要求元素按照一定规则有序存储的情况下使用。
 

// set 底层是 key 模型搜索树 , 不允许重复 数值 , 不允许 修改
// 底层是 红黑树 实现  ,  时间复杂度为O(log n)// 1.存储无序且不重复的元素
// 2.快速查找、删除和插入元素
// 3.去除重复元素
// 4.进行集合间的交集、并集、差集等操作/*
#include<iostream>
#include<set>
#include<vector>
using namespace std;
void test1()// 作用
{set<int> s1;s1.insert(10);s1.insert(40);s1.insert(60);s1.insert(30);s1.insert(40);s1.insert(20);// 排序 + 去重set<int>::iterator it = s1.begin();while (it != s1.end()){cout << *it << " ";//10 30 40 60it++;}cout << endl;
}void test2()// 构造 
{vector<int> v = { 2,6,4,1,4,5,9,8 }; set<int> s(v.begin(), v.end());// set 支持 迭代区间的构造for (auto i : s){cout << i << " ";}cout << endl;set<int> s1 = { 3,6,2,7,2,8,1 };// 支持 Initialist 构造
}void test3()// 删除 
{set<int> s = { 3,6,2,7,2,8,1,5,4,9 };s.erase(4);//删除valfor (auto i : s)cout << i << " ";cout << endl;auto i = s.find(7);s.erase(i);  // 删除位置for (auto i : s)cout << i << " ";cout << endl;
}void test4()
{//迭代器区间删除set<int> s1 = { 10,20,30,40,50,60,70,80,90 };auto itlow = s1.lower_bound(25);// >= 25   itlow指向30     大于等于指定值的第一个元素的迭代器。auto itup = s1.upper_bound(60);//  >60     itup指向70      查找第一个大于指定值的元素的位置s1.erase(itlow, itup);for (auto i : s1)// [30,70) 左闭右开cout << i << " ";// 10 20 70 80 90cout << endl;
}
int main()
{//test1();//test2();//test3();test4();return 0;
}
*/// multiset  底层也是 排序二叉树
// 允许冗余,只实现 排序操作/*
#include<iostream>
#include<set>
#include<vector>
using namespace std;
int main()
{multiset<int> s1 = { 1,3,5,5,4,2,1,3 };for (auto i : s1)cout << i << " ";//1 1 2 3 3 4 5 5s1.erase(3);//默认查找 中序的第一个 keyreturn 0;
}
*///例题1:  找两个数组的交集                       例2:找差集
//相等就是交集,记录下来,it1,it2++              相等就是交集,直接跳过,it1,it2++ 
//不相等,it1,it2小的++,一个到尾就结束            不相等,录入小的,it1,it2小的++,一个到尾就结束
/*
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {set<int> s1(nums1.begin(), nums1.end());set<int> s2(nums2.begin(), nums2.end());vector<int>ans;auto it1 = s1.begin(), it2 = s2.begin();while (it1 != s1.end() && it2 != s2.end()){if (*it1 == *it2){ans.push_back(*it1);it1++, it2++;}else if (*it1 < *it2)it1++;elseit2++;}return ans;
}
*/// map 是 key-value,模型
// 快速的查找功能,其内部实现通常基于红黑树 , 时间复杂度为O(log n)// 1.快速查找:通过键来快速查找对应的值,可以有效加快数据查询的速度。
// 2.自动排序:map会根据键的大小自动对键值 key对进行排序,因此可以按顺序访问键值对。
// 3.唯一键:map中的键是唯一的,每个键只能对应一个值,可以确保数据的唯一性。
// 4.数据存储:可以用map来存储和管理键值对数据,提供了方便的数据组织方式。
// 5.字典:可以将map类比为字典,用键来索引值,方便进行数据管理和查找操作。// key-value : key值不能修改,value可以修改/*
#include<iostream>
#include<map>
#include<string>
using namespace std;void test1()
{//构造map<string, string> dict;pair<string, string> kv1("sort", "排序");dict.insert(kv1);// 有名对象dict.insert(pair<string,string>("left","左边"));//匿名对象dict.insert(make_pair("right", "右边"));//等价与上,使用 make_pair 构造 pairdict.insert({ "String","字符串" });//隐式类型转换map<string, string> dict2 = { {"String","字符串"},{"left","左边"} };//隐式类型转换 + Initializer_list// iterator: key不能修改,value可以修改// const_iterator: 都不能修改``map<string, string>::iterator it = dict.begin();while (it != dict.end()){cout << (*it).first << ":" << it->second << endl;//cout << it.operator->()->first   编译器优化了++it;}cout << endl;for (auto& i : dict)//采用 引用减少复制{cout << i.first << ":" << i.second << endl;}
}void test2()
{string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜",
"苹果", "香蕉", "苹果", "香蕉","苹果","草莓", "苹果","草莓" };map<string, int> countMap;for (auto& e : arr){//auto it = countMap.find(e);//if (it != countMap.end())//{//	it->second++;//}//else //第一次出现//{//	countMap.insert({ e, 1 });//}countMap[e]++; //等价于上//V& operator[](const K& key)//{       //	 pair<iterator, bool> ret = this->insert(make_pair(key, V()));//   iterator it = ret.fisrt;//	 return it->second;//}	 !!!!!!!!!!!!!!!!! 返回 value 的引用 !!!!!!!!!!!!!!!}for (auto& kv : countMap){cout << kv.first << ":" << kv.second << endl;//草莓:2   苹果:8    西瓜 : 3    香蕉 : 2}cout << endl;// multimap 允许 key 冗余multimap<int, string> sortMap;for (auto& kv : countMap){//sortMap[kv.second] = kv.first;// 草莓 被 香蕉 覆盖了 (使用 map_sortMap.insert({ kv.second, kv.first });// key=2 重复,香蕉被 忽略了(使用 map)}cout << endl;// multimap 和 map 一样,会对 key 进行自动排序 for (auto& kv : sortMap){cout << kv.first << ":" << kv.second << endl;}cout << endl;
}// [] 作用
void test3()
{map<string, string> dict;dict.insert({ "string","字符串" });//插入dict["right"]; //插入+修改dict["left"] = "左边";//查找cout << dict["string"] << endl;//修改dict["right"] = "右边";for (auto& i : dict){cout << i.first << ":" << i.second << endl;}string str = "right";cout << dict.count(str) << endl;//打印 个数
}int main()
{//test1();test2();//test3();return 0;
}*/

简单的课堂笔记,去掉注释即可食用,注释什么的都在,诸君,加油!!!!!!!!!!

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

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

相关文章

天润融通:AI赋能客户体验,推动企业收入和业绩增长

“客户体验已经成为全球企业差异化的关键。人工智能与数据分析等创新技术正在加速推动企业在客户体验计划中取得成功&#xff0c;以保持领先地位”。Customer Insights & Analysis 研究经理Craig Simpson说道。 客户体验 (CX&#xff0c;Customer Experience) 是客户在与企…

Unity在非继承自MonoBehaviour的脚本启动协程

在Unity中&#xff0c;协程通常是通过MonoBehaviour的StartCoroutine方法来启动的。很多时候&#xff0c;我们写逻辑层代码的时候也希望能够调用协程&#xff0c;例如网络通讯等功能&#xff0c;这就需要一个中介来帮你做这件事。这个中介通常是一个继承自MonoBehaviour的管理类…

charles抓包

1、去官网下载最新版本&#xff0c;避免出现不必要的问题 2、mac 上charles 的菜单栏在最顶上 3、mac 上安装根证书不受信任 双击下不受信任的正证书&#xff0c;点开信任小文字&#xff0c;然后把下面的这些全部设置为始终信任 4、手机上安装证书 先把wifi代理设置好 如果安…

条码二维码读取设备在医疗设备自助服务的重要性

医疗数字信息化建设的深入推进&#xff0c;医疗设备自助服务系统已成为医疗服务领域的一大趋势&#xff0c;条码二维码读取设备作为自助设备的重要组成部分&#xff0c;通过快速、准确地读取条形码二维码信息&#xff0c;不公提升了医疗服务效率&#xff0c;还为患者提供了更加…

一文了解Java中 Vector、ArrayList、LinkedList 之间的区别

目录 1. 数据结构 Vector 和 ArrayList LinkedList 2. 线程安全 Vector ArrayList 和 LinkedList 3. 性能 插入和删除操作 随机访问 4. 内存使用 ArrayList 和 Vector LinkedList 5. 迭代器行为 ArrayList 和 Vector LinkedList 6. 扩展策略 ArrayList Vecto…

深度相机辅助导航避障(三):地面点云滤除

前面的章节介绍了坐标变换,以及如何设置深度相机的坐标变换。那就可以很直观从机器人的坐标系对深度相机扫描到的障碍物点云进行处理。 在实际应用中,机器人正确估计周围地形,对于道路的可通过性、路径规划和障碍物检测等方面都很重要。那么在获取深度相机点云数据后就得准…

绕过命令过滤器:探索UnixLinux中的Bypass技术

前言 在Unix或Linux系统的安全测试和网络防御中&#xff0c;了解如何绕过命令过滤器是非常重要的。今天&#xff0c;我们将探讨几种利用shell命令绕过安全限制的技巧&#xff0c;这些技巧常用于渗透测试中&#xff0c;以检测系统的安全漏洞。 0x00 命令介绍 一般而言&#x…

学生选课管理系统(JAVA课设)PS:有前端界面

1.课设要求描述 实现系统的所有功能&#xff0c;包括但不限于&#xff1a; 学生信息管理&#xff08;增加、删除、修改、查询&#xff09;课程信息管理选课操作成绩管理 2.制作思路及基础讲解 此项目主要是用于完成大二下半学期的JAVA大作业&#xff0c;也可当作课设&…

树莓派pico入坑笔记,uart使用

uart原理自行百度&#xff0c;相关内容很多其他博主写过并且质量很高&#xff0c;这里不再赘述。 调用circuitpy的busio模块来使用uart&#xff0c;除此以外&#xff0c;spi、iic等要需要使用该模块&#xff0c;使用方法见 官方教程 &#xff0c;详细信息见文档 官方的例子简…

文本生成图像综述

本调查回顾了扩散模型在生成任务中广泛流行的背景下文本到图像的扩散模型。作为一份自成一体的作品&#xff0c;本调查首先简要介绍了基本扩散模型如何用于图像合成&#xff0c;然后介绍了条件或指导如何改善学习。基于这一点&#xff0c;我们介绍了文本到图像生成方面的最新方…

# 深入理解 Java 虚拟机 (二)

深入理解 Java 虚拟机 &#xff08;二&#xff09; Java内存模型 主内存与工作内存 所有的变量存储在主内存&#xff08;虚拟机内存的一部分&#xff09;每条线程有自己的工作内存&#xff0c;线程对变量的所有操作&#xff08;读取、赋值&#xff09;都必须在工作内存中进行…

VMware Windows sever 虚拟机互联网连接配置

一、VMware配置 1、虚拟网络编辑 从左上角 编辑→虚拟网络编辑器 进入 2、配置NAT模式 配置的子网IP&#xff0c;在虚拟机中获取到的ip跟子网IP的前三个是一样的 1.配置网关 2.配置DHCP设置 这个主要是分配ip最后一位获取的区间 3、虚拟机配置 二、Windows Server 虚拟机配置…

【Linux】进程 | 控制块pcb | task_struct | 创建子进程fork

目录 Ⅰ. 进程的概念&#xff08;Process&#xff09; 1. 什么是进程&#xff1f; 2. 多进程管理 3. 进程控制块&#xff08;PCB&#xff09; task_struct 的结构 Ⅱ. 进程查看与管理 1. 使用指令查看进程 2. /proc 查看进程信息 3. 获取进程 ID 4. 创建子进程 原因&…

Spring Boot中的自动配置机制详解

Spring Boot中的自动配置机制详解 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨Spring Boot中的自动配置机制&#xff0c;这是Spring Boot…

STM32启动流程 和 map文件的作用

一&#xff0c;启动流程 1. 复位/上电 2. 根据 BOOT0/BOOT1 确定程序从哪个存储位置执行 3. 初始化 SP 及 PC 指针 将 0X08000000 位置的栈顶地址存放在 SP 指针中 将 0x08000004 位置存放的向量地址装入 PC 程序计数器 4. 初始化系统时钟 5. 初始化用户堆栈 6. 进入main函数 二…

如何用ChatGPT实现智能化编程

如何用ChatGPT实现智能化编程 ChatGPT&#xff0c;作为一个强大的AI助手&#xff0c;可以极大地提高编程效率&#xff0c;帮助更快地实现创新。本文将探讨如何利用ChatGPT辅助编程&#xff0c;从代码生成到优化&#xff0c;再到调试和学习新技术&#xff0c;全面提升编程体验。…

Jmeter TCP接口测试-实例

1、TCP接口结构 TCP接口&#xff1a;只有IP和PORT 传参数据类型根据开发定义的类型 需要添加一个ascii码的十进制字节结束符&#xff0c;tcp才会关闭 2、TCP接口环境搭建 在testfan-tcp-server.jar目录下&#xff0c;启动cmd命令行&#xff0c;输入&#xff1a; java -jar…

Socket编程【个人简单】

介绍 Socket是计算机网络中的一种通信端点&#xff0c;通过它应用程序可以在网络上发送和接收数据。它可以是基于TCP&#xff08;传输控制协议&#xff09;的流套接字&#xff0c;也可以是基于UDP&#xff08;用户数据报协议&#xff09;的数据报套接字。 TCP、UDP、HTTP和We…

Vim插件革命:Linux环境下的终极自动化编辑指南

在Vim中安装插件可以大大增强编辑器的功能。以下是详细的步骤来安装Vim插件&#xff1a; 1. 确认Vim版本 首先&#xff0c;确保你的Vim版本支持插件。在大多数现代Linux发行版中&#xff0c;Vim通常已经配置为支持插件。 vim --version2. 配置Vim 确保你的.vimrc文件允许使…

如何在 SwiftUI 视图中显示应用图标和版本

文章目录 前言获取应用图标获取应用版本创建 SwiftUI 视图总结前言 在应用中显示应用图标和版本是为用户提供快速识别应用版本和变体的好方法,无论是内部用户(如测试人员或利益相关者)还是外部用户。 在本文中,我将展示如何创建一个可访问的 SwiftUI 视图,既能显示应用图…