CPP学习之map和set

1. 关联式容器

在之前博客中我们提到过序列式容器:vector, list, deque, forward_list等,其底层都是线性数据结构。
关联式容器存储的是键值对–<key, value>,与序列式容器仅存储值–key不一样,在数据检索时比序列式容器效率更高。

2. 键值对

键值对<key, value>,key与value形成映射关系,比如建立英汉字典,key为英文单词,对应的value就是中文意思。

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

3. 树形结构的关联式容器

树形结构的关联式容器有以下四种:set、multiset、map、multiset。
这四种容器的底层数据结构是平衡搜索树(红黑树),元素的序列是有序的。

3.1 set

3.1.1 容器性质:

  1. 按照次序存储;
  2. set的key就是value(<value, value>),而且每个value都是唯一的,容器内的元素不能修改(元素都是const类型),但可以进行插入和删除;
  3. 元素内部按照特定严格弱排序准则进行排序;
  4. set底层数据结构是红黑树;
  5. set内元素不可重复;
  6. 容器内查找元素的时间复杂度为O(logN);
  7. 用set的迭代器迭代容器,得到的是有序序列。

注意:multiset可以存储相同的元素,不会去重。

3.1.2 使用:

set容器相关功能具体请参考:set -C++ Reference

// 各容器中,涉及到区间的函数,操作的都是左闭右开
// set 和 multiset,一个排序去重,一个排序不去重
// 在multiset中,find找的是中序第一个,其count的使用比set的count更有意义
// set的iterator都是const修饰过的,这样是为了防止内部树结构被破坏void test_1()
{set<int> s1; //排序+去重s1.insert(1);s1.insert(2);s1.insert(3);s1.insert(4);if (s1.find(2) != s1.end()) //set找内容方式1{cout << "找到了" << endl;}if (s1.count(3)) //set找内容方式2{cout << "找到了" << endl;}set<int>::iterator sit = s1.begin();while (sit != s1.end()){cout << *(sit++) << " ";}cout << endl;}void test_2()
{int arr[] = { 1,2,3,4,5,6,7,8,9 };set<int> s1;for (auto e : arr){s1.insert(e * 10);}for (auto e : s1){cout << e << " ";}cout << endl;set<int>::iterator itlow, itup;//itlow和itup组成左闭右开区间itlow = s1.lower_bound(30); //此处是30,>=号itup = s1.upper_bound(70); //此处是80,因为是>号s1.erase(itlow, itup);for (auto e : s1){cout << e << " "; //80没被删除,这就是左闭右开}cout << endl;s1.insert(50);s1.insert(50);s1.insert(50);s1.insert(50);pair<set<int>::iterator, set<int>::iterator> ret;ret = s1.equal_range(50); //pair存两个迭代器,第一个指向最后的50,第二个指向80set<int>::iterator itlow_bound = ret.first;auto itup_bound = ret.second;cout << *itlow_bound << endl;cout << *itup_bound << endl;}void test_3()
{int arr[] = { 1,2,3,4,5,6,7,8,9 };multiset<int> s1; //排序不去重for (auto e : arr){s1.insert(e * 10);}s1.insert(50);s1.insert(50);s1.insert(50);for (auto e : s1){cout << e << " ";}cout << endl;pair<multiset<int>::iterator, multiset<int>::iterator> ret;ret = s1.equal_range(50); //存放了multiset里指向第一个50和第一个60的迭代器auto itlow_bound = ret.first;auto itup_bound = ret.second;cout << *itlow_bound << endl;cout << *itup_bound << endl;s1.erase(itlow_bound, itup_bound); //删除s1内所有的50for (auto e : s1){cout << e << " ";}cout << endl;}

3.2 map

3.2.1 容器性质

  1. map是存储键值对的容器<key, value>;
  2. key和value的类型可以不同,key与value成映射关系。为了将键值对这种元素存入map中,我们使用结构体pair将键值对绑定在一起;
  3. 在容器内,元素按照key进行排序,但同样地不允许存入相同的key,不同key可以存入相同的value;
  4. map支持下标访问符:value == map[key],其中value与key是绑定的;
  5. map通常被实现为搜索二叉树,更准确的说是红黑树。

注意:multiset可以存储相同的键,不会去重。

3.2.2 使用

map容器相关功能具体请参考:map - C++ Reference

// 关于map
// C++11之后支持多参数的构造函数的隐式类型转换
// 因为C++返回参数只有1个,所以我们可以用结构体来包含多参数然后返回,map存储的内容就是一个个这样的结构体
// 键值对,用make_pair或者隐式类型转换构造出键值对结构存入map中最为方便
// first为键,second为值,键不可修改,值可以;插入一个键相同,但值不相同,则不会插入进去,而且值也不修改
// map最关键的函数:[]重载,既可以插入数据,也可以修改数据,还能访问数据
void test_4()
{map<string, string> dict; //键值对dict.insert({ "apple", "苹果" }); //隐式类型转换,C++11后支持dict.insert(make_pair("peach", "桃子")); //C++98后支持,建议用这种方式pair<string, string> kv = { "banana", "香蕉" };dict.insert(kv);dict.insert(pair<string, string>("melon", "甜瓜"));map<string, string>::iterator it = dict.begin();while (it != dict.end()){cout << it->first << " " << it->second << endl;it++;}}void test_5()
{map<string, int> count_map;string arr[] = { "西瓜", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };for (auto& e : arr){auto it = count_map.find(e); //找到就返回对应迭代器,找不到就返回count_map的endif (it == count_map.end()){count_map.insert(make_pair(e, 1));}else{it->second++;}}//for (auto& e : arr)//{//	count_map[e]++; //map的中括号可搜索内容并返回映射值//}for (auto& e : count_map){cout << e.first << ":" << e.second << endl;}
}

4. 总结

本文简述了关联式容器map和set的性质和使用,如有错误,请批评指正,谢谢。

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

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

相关文章

深入理解C++中的移动赋值与拷贝赋值函数——兼论移动构造函数及其实际应用场景

技术博客&#xff1a;深入理解C中的移动赋值与拷贝赋值函数——兼论移动构造函数及其实际应用场景引言在C编程中&#xff0c;对象的赋值和构造操作是常见的需求。随着C11标准的引入&#xff0c;移动语义&#xff08;Move Semantics&#xff09;成为提升程序性能的重要手段之一。…

免费在线图片合成视频工具 ,完全免费

免费在线图片合成视频工具 &#xff0c;完全免费 免费在线图片合成视频工具是一个完全免费的图片生成视频网站、图片和音乐合成视频网站。 它完全免费&#xff0c;无需注册登录&#xff0c;可以轻松将多张图片转换为视频&#xff0c;支持 jpeg 、png 、webp 格式图片&#xf…

金仓数据库 V9 体验测评:AI 时代国产数据库 “融合” 架构的真实观察

【非广告声明】本文为本人基于金仓数据库 V9 的真实部署测试与技术拆解&#xff0c;无任何商业合作背景&#xff0c;未接受品牌方任何形式的推广委托或费用支持。写作核心是分享国产数据库在 “融合架构”“AI 赋能”“平滑迁移” 等关键场景下的实际使用体验 —— 包括技术细节…

EE进阶1:Maven和SpringBoot基本介绍

Maven什么是mavenMaven简单的理解就是一个项目管理工具&#xff0c;使用pom.xml文件进行管理和获取.jar包&#xff0c;而不用手动进行添加.jar包。创建maven项目以及使用Maven的功能非常多&#xff0c;这里主要理解Maven的项目创建和依赖管理。项目创建&#xff1a;maven本身是…

【系统架构设计(三)】系统工程与信息系统基础下:企业信息化与电子商务-数字化转型的核心驱动力

文章目录一、信息化的基本概念1、 信息化的定义与目的2、 信息化涉及的三大创新3、信息化需求的三个层次二、企业信息化六大方法体系三、信息系统战略规划方法1、 战略规划方法的演进2、 关键成功因素法&#xff08;CSF&#xff09;3、 战略集合转化法&#xff08;SST&#xff…

分布式2PC理论

目录 什么是分布式 2PC&#xff08;Two-Phase Commit&#xff09; 2PC 的工作原理 2PC 的优缺点 为什么 2PC 不完全可靠&#xff1f; 超时问题 协调者故障 什么是分布式 2PC&#xff08;Two-Phase Commit&#xff09; 定义 2PC 是一种原子提交协议&#xff0c;用…

【原创】PDF一键导出图片多张图片一键合成PDF

一、界面功能介绍&#xff1a;PDF输出图片和图片合成PDF二合一 开发动力&#xff1a;WPS有此功能需要VIP收费&#xff0c;其他小软件不能满足我的要求 依赖&#xff1a;友好界面组件&#xff0c;pdf输出图片组件&#xff0c;合并组件 NET8.0&#xff08;NetCore.Winform&#x…

卷积神经网络项目:基于CNN实现心律失常(ECG)的小颗粒度分类系统

卷积神经网络项目实现文档 1、项目简介 1.1 项目名称 ​ 基于CNN实现心律失常&#xff08;ECG&#xff09;的小颗粒度分类系统 1.2 项目简介 ​ 心律失常是临床上常见且潜在致命的心血管疾病之一&#xff0c;包括房性早搏&#xff08;PAC&#xff09;、室性早搏&#xff0…

Linux(1)|入门的开始:Linux基本指令

一、浅谈操作系统1、操作系统是什么&#xff1f;操作系统是一款做软硬件管理的软件我们可以发现除了上面的应用软件&#xff0c;操作系统、设备驱动和硬件都是为软硬件服务的&#xff0c;为了满足用户的不同需求&#xff0c;在操作系统之上需要有各种不同的应用软件。2、一个好…

基于STM32单片机的OneNet物联网云平台农业土壤湿度控制系统

1 系统功能介绍 本设计为 基于STM32单片机的OneNet物联网云平台农业土壤湿度控制系统。系统以STM32F103C8T6单片机作为核心控制器&#xff0c;结合土壤湿度传感器、OLED液晶显示模块、WiFi模块、继电器驱动电路以及按键电路&#xff0c;实现了土壤湿度的实时采集、显示与远程控…

GooglePlay提审问题记录

1、debug签名问题 原因&#xff1a; 为应用签名 | Android Studio | Android Developers 从 IDE 中运行或调试您的项目时&#xff0c;Android Studio 会自动使用由 Android SDK 工具生成的调试证书为您的应用签名。当您首次在 Android Studio 中运行或调试项目时&#xff…

使用Rag 命中用户feedback提升triage agent 准确率

简述使用 RAG&#xff08;Retrieval-Augmented Generation&#xff09;&#xff0c;提升 Triage Agent 对用户反馈的处理准确率。这个方案的背景源于当前系统服务多个租户&#xff0c;各租户在业务场景、问题描述方式、术语使用习惯等方面存在极大差异&#xff0c;导致通用模型…

项目管理方法论有哪些流派

项目管理方法论的主要流派包括&#xff1a;瀑布式方法论、敏捷方法论、Scrum方法论、看板方法论、关键路径法&#xff08;CPM&#xff09;、计划评审技术&#xff08;PERT&#xff09;、挣值管理&#xff08;EVM&#xff09;、精益项目管理、六西格玛、PRINCE2方法论。瀑布式方…

Python远程文件管理高并发处理与负载均衡实战

《Python远程文件管理高并发处理与负载均衡实战》 引言 在5G网络和物联网时代,单台服务器每秒处理上万并发请求已成为基本要求。本文基于Python异步编程框架和分布式架构,深入探讨如何构建支持10万+并发连接的远程文件管理系统。通过实战案例演示,系统在某省级政务云平台实…

第十七章 Java基础-常用API-System

文章目录 package zsk.第十三章常用API.a02system;public

uniapp开发 移动端使用字符串替换注意事项

1. uniapp开发 移动端使用replace注意事项uniapp replaceAll方式在手机失效是因为安卓环境下不支持replaceAll方法。在uniapp开发中&#xff0c;如果在安卓环境下使用replaceAll方法&#xff0c;可能会导致页面无法渲染&#xff0c;并且控制台不会反馈错误信息。为了解决这个问…

【动态规划 矩阵快速幂】P10528 [XJTUPC 2024] 崩坏:星穹铁道|普及+

本文涉及知识点 C动态规划 【矩阵快速幂】封装类及测试用例及样例 P10528 [XJTUPC 2024] 崩坏&#xff1a;星穹铁道 题目背景 Corycle 喜欢玩一个由米哈游自主研发的一款回合制战斗游戏------《崩坏&#xff1a;星穹铁道》。这片银河中有名为「星神」的存在&#xff0c;他们…

捡捡java——2、基础07

Maven项目管理工具 maven项目->本地仓库->判断配置文件->没指定->远程仓库-》本地仓库 ->指定了->镜像仓库-》本地仓库 GroupId&#xff1a;一般是逆向公司域名 ArtifactId&#xff1a;一般是项目jar名 Version&#xff1a;版本号 maven目录里面conf&…

蜂窝通信模组OpenCPU的介绍

一、名词解释 OpenCPU 方案在软件功能上&#xff0c;需要将原来在 MCU 上运行的固件功能&#xff0c;放在 Cat.1 模组的 SoC 芯片上运行。同时&#xff0c;原来通过串口协议交互完成的功能&#xff0c;也变成通过 OpenAPI 调用的方式来完成。软件开发、编译及烧录方面&#xff…

沃丰科技出海客服系统对接沃尔玛全球电商平台,赋能中企出海

经济全球化的当下&#xff0c;中国企业出海步伐不断加快&#xff0c;沃尔玛全球电商平台作为全球极具影响力的零售渠道&#xff0c;成为众多中企开拓国际市场的重要选择。然而&#xff0c;跨境服务的复杂性、多语言沟通障碍、文化差异以及各行业的独特需求&#xff0c;始终是中…