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

C++------map和set的使用

文章目录

  • 关联式容器
  • 键值对
  • 树型结构的关联式容器
    • set的介绍
    • map的介绍

关联式容器

什么是关联式容器?它与序列式容器有什么区别?

关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key,value>结构的键值对,在数据检索时比序列式容器效率更高。这里的序列是容器是指:vector,list、deque的底层。

键值对

键值对我们可以把它理解为英语单词对应中文意义的一种映射关系。该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的value也就是英语单词的中文意思。

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。这四种容器的共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器中的元素是一个有序的序列,平衡二叉搜索树中序遍历可以得到一个有序的序列。

set的介绍

  • 与map/multimap不同,map/multimap中存储的是真正的键值对<key,value>,set中只存放value,但在底层实际存放的是由<value,value>构成的键值对。

  • set中插入元素时,只需要插入value即可,不需要构造键值对。

  • set中的元素不可以重复(因此可以使用set进行去重)。

  • 使用set的迭代器遍历set中的元素,可以得到有序序列

  • set中的元素默认按照小于来比较

  • set中查找某个元素,时间复杂度为: l o g 2 n log_2 n log2n

  • set中的元素不允许修改

  • set中的底层使用二叉搜索树(红黑树)来实现
    在这里插入图片描述
    T: set中存放元素的类型,实际在底层存储<value, value>的键值对。
    Compare:set中元素默认按照小于来比较
    Alloc:set中元素空间的管理方式,使用STL提供的空间配置器管理

使用set的一些代码

int main()
{set<int> myset;for (int i = 1; i < 10; i++){myset.insert(i*10);}set<int>::iterator itlow, itup;//取相邻的数字itlow = myset.lower_bound(35); // >=35itup =myset.upper_bound(60); //> 60cout << *itlow << endl;cout << *itup << endl;myset.erase(itlow, itup);for (auto& e : myset){cout << e << endl;}return 0;
}int main()
{set<int> myset;//set是去重的,这里的代码没有意义,要在multiset里面使用myset.insert(10);myset.insert(10);myset.insert(10);myset.insert(10);myset.insert(10);for (int i = 1; i < 10; i++){myset.insert(i*10);}auto ret = myset.equal_range(10);set<int>::iterator itlow, itup;itlow = ret.first;itup = ret.second;cout << *itlow << endl;cout << *itup << endl;return 0;
}void test_set()
{multiset<int> myset;set是去重的,这里的代码没有意义,要在multiset里面使用myset.insert(10);myset.insert(10);myset.insert(10);myset.insert(10);myset.insert(10);for (int i = 1; i < 10; i++){myset.insert(i * 10);}auto ret = myset.equal_range(10);multiset<int>::iterator itlow, itup;itlow = ret.first;itup = ret.second;cout << *itlow << endl;cout << *itup << endl;for (auto e : myset){cout << e << " ";}cout << endl;myset.erase(itlow, itup);for (auto e : myset){cout << e << " ";}
}

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;
  3. 在内部,map中的元素总是按照键值key进行比较排序的。
  4. map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序 对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。
  5. map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。
  6. map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。
    在这里插入图片描述
    key: 键值对中key的类型
    T: 键值对中value的类型
    Compare: 比较器的类型,map中的元素是按照key来比较的,缺省情况下按照小于来比
    较,一般情况下(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户
    自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)
    Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的
    空间配置器
    注意:在使用map时,需要包含头文件。

使用map的一些代码:

void test_map()
{map<string, string> mymap;//初始化map的方式pair<string, string>kv("sort", "排序");mymap.insert(kv);mymap.insert(pair<string, string>("string", "字符串"));mymap.insert(make_pair("insert", "插入"));//map也有去重功能。 不插入,不覆盖,插入过程中只比较key,不管value,key相同就不可以插入了//C++11支持这样写mymap.insert({ "insert","xxx" });map<string, string>::iterator it = mymap.begin();while (it != mymap.end()){cout << it->first << ":" << it->second << endl;it++;}cout << endl;//范围forfor (const auto& kv : mymap){cout << kv.first << ":" << kv.second << endl;}
}

好的,我们下一篇再见!

相关文章:

C++------map和set的使用

文章目录 关联式容器键值对树型结构的关联式容器set的介绍map的介绍 关联式容器 什么是关联式容器&#xff1f;它与序列式容器有什么区别&#xff1f; 关联式容器也是用来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;其里面存储的是<key&#xff0c;value>结…...

URI和URL和URN区别

URI、URL 和 URN 是一系列从不同角度来看待资源标识和定位的概念。虽然它们有一些重叠&#xff0c;但每个概念都强调了不同的方面。 URI&#xff08;Uniform Resource Identifier&#xff09;&#xff1a;URI 是一个通用的术语&#xff0c;用于标识和定位资源。它是一个抽象的概…...

【Unity学习笔记】DOTween(1)基础介绍

本文中大部分内容学习来自DOTween官方文档 文章目录 什么是DOTween&#xff1f;DOSetOnTweenerSequenceTweenNested tween 初始化使用方式 什么是DOTween&#xff1f; DOTween是一个动画插件&#xff0c;Tween是补间的意思。这个插件以下简称DOT&#xff0c;DOT很方便使用&…...

springboot项目,使用JNA框架调用C++库无法捕获异常的解决思路

写在前面&#xff1a;这个东西真的坑&#xff0c;工作上遇到的和JNA项目的入门案例差别就像是二重积分与小学数学之间的差距&#xff0c;折磨&#xff01; 使用 JNA&#xff08;Java Native Access&#xff09;框架调用 C 库时&#xff0c;如果出现问题导致进程直接结束而无法捕…...

【项目 计网7】4.20 多进程实现并发服务器 4.22 多线程实现并发服务器

文章目录 4.20 多进程实现并发服务器server_process.cclient.c4.22 多线程实现并发服务器客户端代码&#xff1a;服务端代码&#xff1a; 4.20 多进程实现并发服务器 要实现TCP通信服务器处理并发的任务&#xff0c;使用多线程或者多进程来解决。 思路&#xff1a; 1、一个父进…...

论文阅读_扩散模型_LDM

英文名称: High-Resolution Image Synthesis with Latent Diffusion Models 中文名称: 使用潜空间扩散模型合成高分辨率图像 地址: https://ieeexplore.ieee.org/document/9878449/ 代码: https://github.com/CompVis/latent-diffusion 作者&#xff1a;Robin Rombach 日期: 20…...

LeetCode——回溯篇(二)

刷题顺序及思路来源于代码随想录&#xff0c;网站地址&#xff1a;https://programmercarl.com 目录 131. 分割回文串 93. 复原 IP 地址 78. 子集 90. 子集 II 491. 递增子序列 131. 分割回文串 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个…...

RabbitMQ工作模式-发布订阅模式

Publish/Subscribe&#xff08;发布订阅模式&#xff09; 官方文档&#xff1a; https://www.rabbitmq.com/tutorials/tutorial-three-python.html 使用fanout类型类型的交换器&#xff0c;routingKey忽略。每个消费者定义生成一个队列关绑定到同一个Exchange&#xff0c;每个…...

JDK源码解析-Object

1. Object类 所有类的基类——java.lang.Object Object 类是所有类的基类&#xff0c;当一个类没有直接继承某个类时&#xff0c;默认继承Object类Object 类属于 java.lang 包&#xff0c;此包下的所有类在使用时无需手动导入&#xff0c;系统会在程序编译期间自动导入。 思…...

pinia——添加插件——基础积累

问题&#xff1a;是否给pinia添加过插件&#xff1f;具体添加的方式是什么&#xff1f; 在pinia中&#xff0c;我们可以为仓库添加插件&#xff0c;通过添加插件能够扩展以下的内容&#xff1a; 为 store 添加新的属性 定义 store 时增加新的选项 为 store 增加新的方法 包装现…...

软件国产化之殇

今天又看到这么一个帖子讨论一款国产化软件&#xff0c;属实给我震撼到了。 对于国产化产品&#xff0c;一直主打的都是”自研“&#xff0c;难道是我对”自研“这个词的理解有误&#xff1f; 做一个产品&#xff0c;别人开源了&#xff0c;你拿过来使用&#xff0c;你可以说…...

SQLyog问题处理集合

sqlyog 问题处理 1. 错误号码:1049错误&#xff1a; 数据库命令参数参考&#xff1a;数据库命令地址 检查数据库是否存在检查创建的数据库名称 与 要进行连接的数据库名称是否一致&#xff1b; 2. 错误号码:1819错误&#xff1a; MySQL授予远程连接权限时出现&#xff1a; …...

JavaSE【继承和多态】(1)(重点:初始化、pretected封装、组合)

一、继承 继承 (inheritance) 机制 &#xff1a;是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特 性 的基础上进行扩展&#xff0c;增加新功能 &#xff0c;这样产生新的类&#xff0c;称 派生类 。 继承呈现了面向对象程序设计的层次结…...

无涯教程-Android Studio函数

第1步-系统要求 您将很高兴知道您可以在以下两种操作系统之一上开始Android应用程序的开发- MicrosoftWindows10/8/7/Vista/2003(32或64位)MacOSX10.8.5或更高版本,最高10.9(小牛) GNOME或KDE桌面 第二点是,开发Android应用程序所需的所有工具都是开源的,可以从Web上下载。以…...

CentOS8安装mysql8.0.24

一、下载mysql安装包并解压 执行以下命令&#xff1a; # 创建mysql安装目录 mkdir /usr/local/mysql # 进入mysql安装目录 cd /usr/local/mysql/ # 下载mysql-8.0.24 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.24-linux-glibc2.12-x86_64.tar.xz # 解压…...

Quasi-eccentricity Error Modeling and Compensation in Vision Metrology

论文&#xff1a;Quasi-eccentricity Error Modeling and Compensation in Vision Metrology 中文&#xff1a;视觉计量中准偏心误差建模与补偿 论文地址&#xff1a;Sci-Hub | Quasi-eccentricity error modeling and compensation in vision metrology. Measurement Scienc…...

ai智能电话机器人是人类的助手和朋友

一直以来&#xff0c;人工智能都是人们关注的热门话题。在以前&#xff0c;说到人工智能&#xff0c;第一想到的是“机器人”&#xff0c;随着人工智能的普及&#xff0c;AI已经渗透到我们生活的每一个角落。现在&#xff0c;说起人工智能&#xff0c;可能会想到“无人驾驶、无…...

应用TortoiseSVN的SubWCRev管理VisualStudio C#项目编译版本号

首先要安装 TortoiseSVN, 并确保TortoiseSVN的bin目录被加入到系统环境变量Path中。 1、拷贝Porperties目录下的文件AssemblyInfo.cs生成副本AssemblyInfo.template, 作为版本管理的模板文件。 2、修改模板文件中的想要管理的版本号信息 // [assembly: AssemblyVersion(&quo…...

【八股】2023秋招八股复习笔记5(计算机网络-CN)

文章目录 八股目录目录1、应用层 & HTTP一些http题HTTPS 加密原理&#xff08;问过&#xff09;HTTP/1.1 新特性HTTP/2.0 与 RPC&#xff08;问过&#xff09;GET 和 POST 比较 2、传输层 & TCPTCP三次握手 & 四次挥手&#xff08;问过&#xff09;为什么每次TCP 连…...

【C++】SLT——Vector详解

本片要分享的是关于STL中Vector的内容&#xff0c;Vector的内容于string非常相似&#xff0c;只要会使用string那么学习Vector时会非常流畅。 目录 1.vector介绍 2.vector的简单实用 2.1.简单的无参构造 ​编辑2.2.简单带参构造 2.3.迭代器区间初始化 2.4.vector的遍历 …...

Unity安卓打包实战指南:从环境配置到APK生成全链路排错

1. 这不是“入门教程”&#xff0c;而是一份写给真实开发现场的生存指南你打开Unity&#xff0c;新建一个3D项目&#xff0c;拖进一个Cube&#xff0c;点击Play——它动了。你松了口气&#xff0c;觉得“Unity好像也没那么难”。但当你把APK打包发给测试同事&#xff0c;对方回…...

自制极低频电流探头:负电阻补偿原理与低频方波测量实践

1. 项目概述&#xff1a;为极低频电流测量而生在电子测试领域&#xff0c;电流探头是个再常见不过的工具&#xff0c;无论是排查开关电源的纹波&#xff0c;还是分析电机驱动的波形&#xff0c;都离不开它。但如果你尝试用市面上常见的电流探头去观察一个频率低至几赫兹&#x…...

打不开JupyterLab

因为安装某些依赖导致JupyterLab的依赖被动升级或降级&#xff0c;从而影响了JupyterLab的运行&#xff0c;此时可以SSH登录到实例&#xff0c;然后输入jupyter-lab命令进行确认&#xff0c;如果执行命令报错则说明是此问题&#xff0c;那么可以通过pip install jupyterlab再次…...

Burp Suite拦截与替换机制深度解析:从协议层到规则链

1. 这不是“点开就能用”的功能&#xff0c;而是你和目标系统之间的一道可编程闸门很多人第一次在Burp Suite里点开Proxy → Intercept&#xff0c;看到HTTP请求被拦下来&#xff0c;兴奋地改个User-Agent、删个Cookie就点Forward&#xff0c;以为自己已经掌握了“拦截与替换”…...

AI圈内火热的Agent、MCP、Skill、CLI是啥?用装修房子讲透,看完秒懂

本文用装修房子的比喻&#xff0c;详细解释了AI领域的四个核心概念&#xff1a;Agent如同会自主规划任务的私人助理&#xff1b;MCP是AI与外部工具数据的统一接口&#xff0c;类似USB-C&#xff1b;Skill是指导AI按标准操作执行的手册&#xff1b;CLI则是不依赖图形界面的命令行…...

如何用HsMod解锁炉石传说60+项隐藏功能:终极优化指南

如何用HsMod解锁炉石传说60项隐藏功能&#xff1a;终极优化指南 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod HsMod是一款基于BepInEx开发的炉石传说功能增强插件&#xff0c;为玩家提供…...

Unlock-Music:浏览器中一键解锁加密音乐文件的完整指南

Unlock-Music&#xff1a;浏览器中一键解锁加密音乐文件的完整指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: http…...

如何用Untrunc拯救损坏视频?2025年终极MP4修复工具完全指南

如何用Untrunc拯救损坏视频&#xff1f;2025年终极MP4修复工具完全指南 【免费下载链接】untrunc Restore a damaged (truncated) mp4, m4v, mov, 3gp video. Provided you have a similar not broken video. 项目地址: https://gitcode.com/gh_mirrors/unt/untrunc 当你…...

Mysql?基础语法!!!

作为程序员、数据分析从业者&#xff0c;甚至是产品运营&#xff0c;SQL都是必须掌握的核心技能。不管是后端开发对数据库增删改查&#xff0c;还是数据分析提取业务数据&#xff0c;本质都是在写SQL语句。很多新手觉得SQL难&#xff0c;其实是没有理清逻辑。SQL的核心逻辑非常…...

3分钟终极指南:用ncmdump轻松解密网易云音乐NCM格式文件

3分钟终极指南&#xff1a;用ncmdump轻松解密网易云音乐NCM格式文件 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump正是解决这个问题的神器&…...