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的使用        

extra 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)        

        

        


附录 力扣编程题

692. 前K个高频单词 - 力扣(LeetCode)        

        

class Solution {
public:// pair类型的relation比较重载不符合我们的需求,我们可以自己写一个仿函数struct kvCompare{bool operator()(const pair<string, int>& kv1, const pair<string, int>& kv2){return kv1.second > kv2.second || (kv1.second == kv2.second && kv1.first < kv2.first);}};vector<string> topKFrequent(vector<string>& words, int k) {map<string, int> countMap;for(auto& kv : words) countMap[kv]++;// map的迭代器是双向迭代器(重载++、--,不支持+、-)// 所以我们把数据放入vector再使用sort进行排序vector<pair<string, int>> kv(countMap.begin(), countMap.end());sort(kv.begin(), kv.end(), kvCompare());// 返回的结果只需要string,我们整理一下vector<string> v;for(int i=0; i<k; i++){v.push_back(kv[i].first);}return v;}
};

        

349. 两个数组的交集 - 力扣(LeetCode)        

        

class Solution {
public: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> ret;// 找交集(已经有序)// 相同的就是交集的元素,it1++、it2++; 不相等,较小的it++。有一个it结束了整个筛查就结束了// 找差集(已经有序)// 相等,it1++、it2++; 不相等,较小的是差集的元素,较小的it++。有一个it结束了,另一个没结束的也都是差集的元素auto it1 = s1.begin();auto it2 = s2.begin();while(it1 != s1.end() && it2!= s2.end()){if(*it1 < *it2) it1++;else if(*it1 > *it2) it2++;else{ret.push_back(*it1);it1++, it2++;}}return ret;}
};

        

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

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

相关文章

【ICN综述】信息中心网络隐私安全

ICN基本原理&#xff1a; 信息中心网络也是需要实现在不可信环境下可靠的信息交换和身份认证 信息中心网络采用以数据内容为中心的传输方式代替现有IP 网络中以主机为中心的通信方式&#xff0c;淡化信息数据物理或逻辑位置的重要性&#xff0c;以内容标识为代表实现数据的查找…

竞赛 深度学习猫狗分类 - python opencv cnn

文章目录 0 前言1 课题背景2 使用CNN进行猫狗分类3 数据集处理4 神经网络的编写5 Tensorflow计算图的构建6 模型的训练和测试7 预测效果8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习猫狗分类 ** 该项目较为新颖&a…

leetcode经典面试150题---5.多数元素

目录 题目描述 前置知识 代码 方法一 排序法 思路 实现 复杂度 方法二 哈希表 思路 实现 题目描述 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给…

MySQL中如何书写update避免锁表

1. 什么是MySQL锁表&#xff1f; MySQL锁表是指在对某个数据表进行读写操作时&#xff0c;为了保证数据的一致性和完整性&#xff0c;系统会对该数据表进行锁定&#xff0c;防止其他用户对该表进行操作。 2. 为什么会出现锁表&#xff1f; 当多个用户同时对同一个数据表进行…

Linux中的高级IO

文章目录 1.IO1.1基本介绍1.2基础io的低效性1.3如何提高IO效率1.4五种IO模型1.5非阻塞模式的设置 2.IO多路转接之Select2.1函数的基本了解2.2fd_set理解2.3完整例子代码&#xff08;会在代码中进行讲解&#xff09;2.4优缺点 3.多路转接之poll3.1poll函数的介绍3.2poll服务器3.…

node教程(五)接口+会话

文章目录 一.接口1.1接口是什么?1.2接口的作用1.3接口的开发与调用1.4接口的组成 一.接口 1.1接口是什么? 接口是前后端通信的桥梁 1.2接口的作用 实现前后端通信 1.3接口的开发与调用 大多数接口都是由后端工程师开发的&#xff0c;开发语言不限 一般情况下接口都是由…

【iOS】知乎日报前三周总结

这几天一直在进行知乎日报的仿写&#xff0c;仿写过程中积累了许多实用的开发经验&#xff0c;并对MVC有了更深的了解&#xff0c;特撰此篇作以总结 目录 第一周将网络请求封装在一个单例类Manager中SDWebImage库的简单使用运用时间戳处理当前时间自定义NavigationBar 第二周在…

16. 机器学习 - 决策树

Hi&#xff0c;你好。我是茶桁。 在上一节课讲SVM之后&#xff0c;再给大家将一个新的分类模型「决策树」。我们直接开始正题。 决策树 我们从一个例子开始&#xff0c;来看下面这张图&#xff1a; 假设我们的x1 ~ x4是特征&#xff0c;y是最终的决定&#xff0c;打比方说是…

直流无刷电机(BLDC)六步换相驱动

直流无刷电机&#xff08;BLDC&#xff09;六步换相驱动 文章目录 直流无刷电机&#xff08;BLDC&#xff09;六步换相驱动1. 前言2. 六步换相原理3. 电角度与机械角度4. 动手实践4.1 霍尔输出表测量4.2 换向控制4.3 代码编写 5. 总结 1. 前言 直流无刷电机相对直流有刷电机具…

基于社交网络算法的无人机航迹规划-附代码

基于社交网络算法的无人机航迹规划 文章目录 基于社交网络算法的无人机航迹规划1.社交网络搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用社交网络算法来优化无人机航迹规划。 …

【Java 进阶篇】Java Session 原理及快速入门

大家好&#xff0c;欢迎来到本篇博客。今天&#xff0c;我们将探讨Java Web开发中一个重要而令人兴奋的概念&#xff0c;即Session&#xff08;会话&#xff09;。Session是一种在Web应用程序中跟踪用户状态和数据的机制。我们将深入了解Session的原理&#xff0c;并通过示例来…

鸿运主动安全云平台任意文件下载漏洞复习

简介 深圳市强鸿电子有限公司鸿运主动安全监控云平台网页存在任意文件下载漏洞&#xff0c;攻击者可通过此漏洞下载网站配置文件等获得登录账号密码 漏洞复现 FOFA语法&#xff1a;body"./open/webApi.html" 获取网站数据库配置文件 POC&#xff1a;/808gps/Mobile…

Winform 实现俄罗斯方块游戏(一)

第一步&#xff0c;先用GDI绘制小正方形方块&#xff0c;其它形状的用这个方块合成 如何绘制一个方块&#xff1f;先绘制两个正方形&#xff0c;如下&#xff1a; 然后四周用梯形填充&#xff0c;内部颜色用渐变&#xff0c;这样更有立体感&#xff0c;下篇介绍如何实现。

Observability:使用 OpenTelemetry 手动检测 .NET 应用程序

作者&#xff1a;David Hope 在快节奏的软件开发领域&#xff0c;尤其是在云原生领域&#xff0c;DevOps 和 SRE 团队日益成为应用程序稳定性和增长的重要合作伙伴。 DevOps 工程师不断优化软件交付&#xff0c;而 SRE 团队则充当应用程序可靠性、可扩展性和顶级性能的管理者。…

Apache Doris (五十一): Doris数据缓存

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1.

96. 不同的二叉搜索树

给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#xff1a;n 1 输出&#xff1a;1提…

PostCSS通过px2rem插件和lib-flexible将px单位转换为rem(root em)单位实现大屏适配

目录 文档postcss中使用postcss-plugin-px2rem安装postcss-plugin-px2rem示例默认配置 webpack中使用postcss-plugin-px2rem项目结构安装依赖文件内容 大屏适配参考文章 文档 类似的插件 postcss-plugin-px2rem https://www.npmjs.com/package/postcss-plugin-px2remhttps://g…

Docker容器技术实战4

11、docker安全 proc未被隔离&#xff0c;所以在容器内和宿主机上看到的东西是一样的 容器资源控制 cpu资源限制 top命令&#xff0c;查看cpu使用率 ctrlpq防止退出回收&#xff0c;容器会直接调用cgroup&#xff0c;自动创建容器id的目录 cpu优先级设定 测试时只保留一个cpu…

翻页电子杂志制作功略,快收藏,保管好用!

翻页电子杂志&#xff0c;我相信这对大家很熟悉吧&#xff0c;大家也都经常看电子杂志吧。它和我们的生活紧密相关&#xff0c;也极大地改变了我们的阅读方式。听到这“翻页电子杂志”&#xff0c;是不是觉得制作起来肯定很难很复杂&#xff0c;需要专业的人才能制作呢&#xf…

51单片机汇编-点亮一个led

文章目录 前言1.打开IDE2.设置编辑器3.设置输出4. 原理图5.编写代码6 编译7.下载8.其它代码1.LED闪烁2.跑马灯 前言 51单片机基础 本章主要介绍打开一个led,具体采用51汇编 1.打开IDE 选择STC89C52RC 后缀是.asm 2.设置编辑器 3.设置输出 4. 原理图 5.编写代码 ORG 00H;伪代…