当前位置: 首页 > news >正文

map set

目录

一、关联式容器

二、键值对

三、树形结构的关联式容器

3.1 set

3.1.1 set的介绍        

3.1.2 set的使用       

3.2 multiset        

3.2.1 multiset的介绍         

3.2.2 multiset的使用         

3.3 map       

3.3.1 map的介绍         

3.3.2 map的使用        

3.4 multimap       

3.4.1 multimap的介绍      

3.3.2 multimap的使用         


        如果你已经了解了KV二叉搜索树,将会更容易读懂本文 


一、关联式容器

        STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别?关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。

        


二、键值对

        用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且英文单词与其中文含义是一一对应的关系,即通过该应该单词,在词典中就可以找到与其对应的中文含义,那么我们就可以通过键值对来描述这种关系。

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

        


三、树形结构的关联式容器

        根据应用场景的不桶,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列。下面一依次介绍每一个容器。

3.1 set

3.1.1 set的介绍        

文档介绍

set - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/set/set/?kw=set

  • set是按照一定次序存储元素的容器,底层是用二叉搜索树(红黑树)实现的
  • 对于set,元素的value也标识它本身(即value就是key,类型为T),并且每个value必须是唯一的(确保每个元素都可以标识它本身)。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们
  • 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序(默认按照小于来比较)
  • set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代

                

3.1.2 set的使用       

详细内容见文档介绍,下面是接口和示例代码:接下来,通过下面这段代码学习 lower_bound 和 up_bound      

void test_set2()
{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 90itlow = myset.lower_bound(30);	    // >= val值位置的iteratoritup = myset.upper_bound(70);		// >  val值位置的iteratorset<int>::iterator it = itup;while (it != myset.end()){cout << *it << " ";++it;}cout << endl;						// 80 90myset.erase(itlow, itup);		    // 10 20 70 80 90for (auto e : myset){cout << e << " ";}cout << endl;
}void test_set3()
{std::set<int> myset;for (int i = 1; i <= 5; i++) myset.insert(i * 10);   // myset: 10 20 30 40 50//std::pair<std::set<int>::const_iterator, std::set<int>::const_iterator> ret;auto ret = myset.equal_range(35);std::cout << "the lower bound points to: " << *ret.first << '\n';   // >= valstd::cout << "the upper bound points to: " << *ret.second << '\n';  // > val
}

        

3.2 multiset        

3.2.1 multiset的介绍         

文档介绍

multiset - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/set/multiset/?kw=multiset

  • multiset是按照特定顺序存储元素的容器,其中元素是可以重复的,multiset底层结构为二叉搜索树(红黑树)
  • 在multiset中,元素的value也会识别它本身(因为multiset中本身存储的就是<value, value>组成的键值对,因此value本身就是key,key就是value,类型为T)。multiset元素的值不能在容器中进行修改(因为元素总是const的),但可以从容器中插入或删除
  •  在内部,multiset中的元素总是按照其内部比较规则(类型比较)所指示的特定严格弱排序准则进行排序
  • multiset容器通过key访问单个元素的速度通常比unordered_multiset容器慢,但当使用迭代器遍历时会得到一个有序序列

        

3.2.2 multiset的使用         

仅演示与set的不同之处,大体上可以参考set的用法        

void test_multiset()
{// 排序multiset<int> s;s.insert(5);s.insert(2);s.insert(6);s.insert(1);s.insert(5);s.insert(2);multiset<int>::iterator it = s.begin();while (it != s.end()){cout << *it << " ";++it;}cout << endl;// 如果有多个值,find返回中序第一个valit = s.find(5);while (it != s.end()){cout << *it << " ";++it;}cout << endl;cout << s.count(2) << endl;// [>=val, >val)//auto ret = s.equal_range(2);//s.erase(ret.first, ret.second);size_t n = s.erase(2);cout << n << endl;for (auto e : s){cout << e << " ";}cout << endl;
}VS2022 运行结果1 2 2 5 5 6
5 5 6
2
2
1 5 5 6

        

3.3 map       

3.3.1 map的介绍         

文档介绍

map - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/map/map/?kw=map

  • map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))
  • 在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名称为pair:typedef pair<const key, T> value_type;
  • 在内部,map中的元素总是按照键值key进行比较排序的(默认按照小于的方式对key进行比较)。
  • map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。
  • map支持下标访问符,即在[]中放入key,就可以找到与key对应的value

        

3.3.2 map的使用        

void test_map1()
{map<string, string> dict;dict.insert(pair<string, string>("sort", "排序"));dict.insert(pair<string, string>("insert", "插入"));dict.insert(pair<const char*, const char*>("left", "左边"));//dict.insert(make_pair("right", "右边")); // 优化dict["erase"];					// 插入cout << dict["erase"] << endl;  // 查找dict["erase"] = "删除";			// 修改cout << dict["erase"] << endl;  // 查找dict["test"] = "测试";			// 插入+修改dict["left"] = "左边、剩余";	// 修改string s1("xxxx"), s2("yyyy");dict.insert(make_pair(s1, s2));map<string, string>::iterator it = dict.begin();while (it != dict.end()){    // 三种打印方式cout << (*it).first << ":" << (*it).second << endl;//cout << it.operator->()->first << ":" << it.operator->()->second << endl;//cout << it->first << ":" << it->second << endl;++it;}cout << endl;for (auto& kv : dict){// kv.first += 'x';kv.second += 'x';cout << kv.first << ":" << kv.second << endl;}
}运行结果删除
erase:删除
insert:插入
left:左边、剩余
right:右边
sort:排序
test:测试
xxxx:yyyyerase:删除x
insert:插入x
left:左边、剩余x
right:右边x
sort:排序x
test:测试x
xxxx:yyyyx

使用map统计水果出现的次数

void test_map2()
{string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };map<string, int> countMap;//for (auto& str : arr)//{//	//auto ret = countMap.find(str);//	//if (ret == countMap.end())//	//{//	//	// 没有表示第一次出现,插入//	//	countMap.insert(make_pair(str, 1));//	//}//	//else//	//{//	//	// 有就让次数++//	//	ret->second++;//	//}//	countMap[str]++;//}// 更优代码for (auto& str : arr){countMap[str]++;}for (auto& kv : countMap){cout << kv.first << ":" << kv.second << endl;}
}

extra map的[ ]重载代码剖析        

        

3.4 multimap       

3.4.1 multimap的介绍      

文档介绍        

multimap - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/map/multimap/?kw=multimap        

  • multimaps是关联式容器,它按照特定的顺序,存储由key和value映射成的键值对<key,value>,其中多个键值对之间的key是可以重复的。multimap在底层用二叉搜索树(红黑树)来实现。
  • 在multimap中,通常按照key排序和惟一地标识元素,而映射的value存储与key关联的内容。key和value的类型可能不同,通过multimap内部的成员类型value_type组合在一起,value_type是组合key和value的键值对:typedef pair<const Key, T> value_type;
  • 在内部,multimap中的元素总是通过其内部比较对象,按照指定的特定严格弱排序标准对key进行排序的。
  • multimap通过key访问单个元素的速度通常比unordered_multimap容器慢,但是使用迭代器直接遍历multimap中的元素可以得到关于key有序的序列。

        

3.3.2 multimap的使用         

        multimap中的接口可以参考map,功能都是类似的,需要注意的是:multimap没有重载operator[]操作(为什么?)
        multimap可以有多个重复的key,那么operator[ ]返回哪个key的value呢?        


相关文章:

map set

目录 一、关联式容器 二、键值对 三、树形结构的关联式容器 3.1 set 3.1.1 set的介绍 3.1.2 set的使用 3.2 multiset 3.2.1 multiset的介绍 3.2.2 multiset的使用 3.3 map 3.3.1 map的介绍 3.3.2 map的使用 …...

Fourier分析导论——第3章——Fourier级数的收敛性(E.M. Stein R. Shakarchi)

第 3 章 Fourier级数的收敛性(Convergence of Fourier Series) The sine and cosine series, by which one can represent an arbitrary function in a given interval, enjoy among other remarkable properties that of being convergent. This property did not escape…...

解决ruoyi-vue部署到域名子路径静态资源404

参考ruoyi前端手册...

游戏引擎中为什么要用四元数表示旋转而不用欧拉角旋转?

个人观点&#xff0c;仅供参考&#xff0c;如有错误可太刺激了 四元数的简单概念和使用 欧拉角通常用于表示一个物体的旋转状态&#xff0c;而不是表示旋转过程。 欧拉角描述的是物体相对于某个参考坐标系的朝向或旋转状态&#xff0c;通常以不同的轴&#xff08;例如&#x…...

E-Office(泛微OA)前台任意文件读取漏洞复现

简介 泛微E-Office是一款企业级的全流程办公自动化软件&#xff0c;它包括协同办公、文档管理、知识管理、工作流管理等多个模块&#xff0c;涵盖了企业日常工作中的各个环节。在该产品前台登录页存在文件读取漏洞。 officeserver.php文件存在任意文件读取漏洞&#xff0c;通…...

前端小案例 | 喵喵大王立大功 | 一个带便利贴功能的todolist面板

文章目录 &#x1f4da;html&#x1f4da;css&#x1f4da;js&#x1f407;stickynote.js&#x1f407;todolist.js&#x1f407;clock.js &#x1f4da;html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><m…...

算法训练营第十一天 | 20. 有效的括号、 1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

目录&#xff1a; 力扣 20. 有效的括号力扣 1047. 删除字符串中的所有相邻重复项力扣 150. 逆波兰表达式求值 问题一、 20. 有效的括号 题目链接&#xff1a;20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 思路分析&#xff1a; 很多朋友刚开始接触这一类题的时候…...

Python unittest单元测试框架 TestSuite测试套件

TestSuite 测试套件简介 对一个功能的验证往往是需要很多多测试用例&#xff0c;可以把测试用例集合在一起执行&#xff0c;这就产生了测试套件TestSuite 的概念&#xff0c;它是用来组装单个测试用例&#xff0c;规定用例的执行的顺序&#xff0c;而且TestSuite也可以嵌套Tes…...

FSB逮捕为乌克兰网络部队工作的俄罗斯黑客

导语 近日&#xff0c;俄罗斯联邦安全局&#xff08;FSB&#xff09;逮捕了两名涉嫌协助乌克兰网络部队对俄罗斯重要基础设施目标进行网络攻击的个人。这起事件引起了广泛关注&#xff0c;涉及到了网络安全和国际关系等多个领域。本文将为您详细介绍这一事件的背景和最新进展。…...

【PC电脑windows-学习样例tusb_serial_device-ESP32的USB模拟串口程序+VScode建立工程+usb组件添加+-基础样例学习】

【PC电脑windows-学习样例tusb_serial_device-ESP32的USB模拟串口程序-基础样例学习】 1、概述2、实验环境3-1、 物品说明3-2、所遇问题&#xff1a;ESP32 cannot open source file "tinyusb.h"或者“tinyusb.h:No such file or directory ....”3-3、解决问题&#…...

LeetCode75——Day26

文章目录 一、题目二、题解 一、题目 394. Decode String Given an encoded string, return its decoded string. The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is guar…...

面试算法53:二叉搜索树的下一个节点

题目 给定一棵二叉搜索树和它的一个节点p&#xff0c;请找出按中序遍历的顺序该节点p的下一个节点。假设二叉搜索树中节点的值都是唯一的。例如&#xff0c;在图8.9的二叉搜索树中&#xff0c;节点8的下一个节点是节点9&#xff0c;节点11的下一个节点是null。 分析&#xf…...

2023SHCTF web方向wp

1.ezphp 看一眼&#xff0c;你大爷&#xff0c;啥玩意都给我过滤完了。 还好下面有preg_replace()/e&#xff0c;会把replacement当作php语句执行 传参pattern.*&#xff0c; .*表示任意字符&#xff0c;code{${phpinfo()}} &#xff0c;为什么这样写&#xff0c;因为,print_…...

从物理磁盘到数据库 —— 存储IO链路访问图

原图来自&#xff1a;数据库IO链路访问图 – OracleBlog 由于很复杂&#xff0c;为了加深理解自己重新画了一次&#xff0c;另外参考其他文档补充了各部分的插图和介绍。 一、 存储服务器 1. 物理磁盘 外层的壳子称为硬盘笼 cage 2. chunklet Chunklet 是一个虚拟概念而不是实…...

基于java+springboot+vue在线选课系统

项目介绍 本系统结合计算机系统的结构、概念、模型、原理、方法&#xff0c;在计算机各种优势的情况下&#xff0c;采用JAVA语言&#xff0c;结合SpringBoot框架与Vue框架以及MYSQL数据库设计并实现的。员工管理系统主要包括个人中心、课程管理、专业管理、院系信息管理、学生…...

GO学习之 同步操作sync包

GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…...

NUUO网络摄像头(NVR)RCE漏洞复现

简介 NUUO Network Video Recorder&#xff08;NVR&#xff09;是中国台湾NUUO公司的一款网络视频记录器。 NUUO NVR视频存储管理设备的__debugging_center_utils___.php文件存在未授权远程命令执行漏洞&#xff0c;攻击者可在没有任何权限的情况下通过log参数执行任意命令。…...

一款快速获取目标网站关键信息的工具

1.摘要 今天要介绍的这款工具是一个快速收集网站信息的开源脚本, 采用Python语言编写, 该工具可以快速收集网站的页面标题、网站上次更新日期、DNS信息、子域、防火墙名称、网站使用的技术栈、证书等信息, 默认支持对验证码和JavaScript内容执行绕过操作。 2.工具安装使用 使…...

将GC编程语言引入WebAssembly的新方法

本文讨论了一种名为 WasmGC 的新方法&#xff0c;用于将垃圾收集编程语言有效地引入 WebAssembly。 WasmGC 定义了新的 GC 类型&#xff0c;例如结构和数组&#xff0c;与之前编译为线性内存的方法 (WasmMVP) 相比&#xff0c;它们可以实现更好的优化&#xff1a; 在编译时和…...

微信小程序UI自动化测试实践:Minium+PageObject

小程序架构上分为渲染层和逻辑层&#xff0c;尽管各平台的运行环境十分相似&#xff0c;但是还是有些许的区别&#xff08;如下图&#xff09;&#xff0c;比如说JavaScript 语法和 API 支持不一致&#xff0c;WXSS 渲染表现也有不同&#xff0c;所以不论是手工测试&#xff0c…...

别让中文路径坑了你!FaceFusion在Windows和Mac上的完整环境配置与文件规范指南

别让中文路径坑了你&#xff01;FaceFusion在Windows和Mac上的完整环境配置与文件规范指南 在数字创意领域&#xff0c;FaceFusion作为一款强大的AI换脸工具&#xff0c;正受到越来越多内容创作者的青睐。然而&#xff0c;许多用户在初次接触时往往会被一系列看似莫名其妙的错误…...

NY378固态MT29F32T08GSLBHL8-24QA:B

NY378固态MT29F32T08GSLBHL8-24QA:B你是否曾好奇&#xff0c;那些默默支撑着工业设备稳定运行、保障数据高速流转的存储核心&#xff0c;究竟蕴藏着怎样的技术密码&#xff1f;今天&#xff0c;我们将聚焦一颗在特定领域中扮演关键角色的芯片——来自美光&#xff08;Micron&am…...

别再死磕原生OpenStack了!华为云Stack HCS 8.0的极简部署与高可用设计,真香!

华为云Stack HCS 8.0&#xff1a;企业私有云部署的革命性突破 当企业IT架构师面对私有云平台选型时&#xff0c;部署复杂性和系统可靠性往往成为最令人头疼的两大难题。原生OpenStack以其高度灵活性和开源特性吸引了大量技术团队&#xff0c;但随之而来的却是漫长的部署周期、繁…...

VT2516A板卡进阶玩法:模拟汽车线束开路/短路故障,做更真实的ECU诊断测试

VT2516A板卡实战&#xff1a;构建汽车线束故障注入测试系统 在汽车电子控制系统开发中&#xff0c;ECU对电气故障的检测和处理能力直接关系到整车安全性和可靠性。传统测试方法往往局限于理想工况下的信号模拟&#xff0c;难以覆盖真实车辆可能遭遇的线束开路、短路等异常场景…...

湿敏电阻HR202/CM-R的两种驱动方案详解:IO充放电法 vs. 交流方波AD采样

湿敏电阻HR202/CM-R的两种驱动方案深度解析&#xff1a;从原理到实战选择 在环境监测和智能家居领域&#xff0c;湿敏电阻作为成本效益突出的湿度传感方案&#xff0c;其驱动电路的设计直接影响测量精度和系统稳定性。HR202和CM-R作为市面上常见的湿敏电阻型号&#xff0c;工程…...

【头歌Educoder】国防科大 模板与 STL

第1关&#xff1a;初识模板函数任务目的本关目的&#xff1a;编写你的第一个模板函数。编程要求本题的要求为&#xff1a;编写模板函数 template <typename T, int n> int getIndex (T a[], T x)返回长度为 n 的数组 a 中 x 第一个出现的位置&#xff08;下标&#xff09…...

别再被CAPL路径搞懵了!getAbsFilePath、setFilePath这几个函数到底怎么用?

CAPL文件路径操作全解析&#xff1a;从函数原理到实战避坑指南 在CANoe自动化测试开发中&#xff0c;文件路径操作堪称最基础却又最容易出错的环节之一。许多工程师都经历过这样的场景&#xff1a;精心编写的CAPL脚本在本地测试一切正常&#xff0c;换到同事电脑上却频频报错&a…...

人工智能系统的测试:AI模型的可靠性与鲁棒性测试

在人工智能技术深度渗透各行业的当下&#xff0c;AI模型的可靠性与鲁棒性直接关乎业务安全与用户信任。对于软件测试从业者而言&#xff0c;突破传统测试思维&#xff0c;构建适配AI特性的测试体系&#xff0c;已成为保障AI系统高质量落地的核心任务。 一、AI模型可靠性与鲁棒…...

别再死记命令了!用ENSP模拟企业网,手把手教你配置VRRP+MSTP实现网关和链路双备份

企业网络高可用实战&#xff1a;用ENSP构建VRRPMSTP双冗余架构 刚接触企业网络设计的工程师常陷入一个误区&#xff1a;把网络设备配置等同于命令记忆。我曾见过一位学员能完整背诵VRRP的配置指令&#xff0c;却在真实网络故障时手足无措——因为他从未理解这些命令背后的网络逻…...

QiWe 免费开源微信机器人:从零到一的完整开发与部署指南

1. 为什么选择 QiWe 开源框架&#xff1f; 在私域流量运营和社群智能化的浪潮中&#xff0c;微信机器人早已成为降本增效的利器。然而&#xff0c;市面上许多闭源方案不仅收费高昂&#xff0c;还存在严重的数据泄露风险。QiWe 作为一款优秀的免费开源微信机器人框架&#xff0c…...