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

C++map容器关联式容器

C++map

1. 关联式容器

vector、list、deque、forward_list(C++11)等STL容器,其底层为线性序列的数据结构,里面存储的是元素本身,这样的容器被统称为序列式容器。而map、set是一种关联式容器,关联式容器也是用来存储数据的,与序列式容器不同的是,关联式容器里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。map和set的键是唯一的,但是mutimap和multiset支持多个同名且有不同映射的键共存。

2. 键值对

用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value, key代表键值,value表示与key对应的信息。比如:学生的姓名和他的学号是一一对应的,那么就可以通过查找学生的姓名来查找到对应的学号。map容器是Key Value结构,允许修改value,且允许多个相同的value存在。但map不允许存在相同的key(multimap除外),且key不可修改(因为会破坏内部的红黑树结构)。

3. map容器

在这里插入图片描述

形参含义:

key:键值对应key的类型
T:键值对应value的类型
Compare:比较器的类型,map中的元素是按照key来比较的,缺省情况下按照小于来比较,一般情况下(内置类型元索)该参数不需要传递,如果无法比较时(自定义类型),需要用户自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)
Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的空间配置器

4. map的成员变量

map中键是不允许被修改的(因为修改键会破坏搜索二叉树的结构),但是映射可以被修改。map在value_type中使用了pair来保护键。map实例化的格式,实际上是调用了pair模板的显式实例化。

pair:

在这里插入图片描述

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

5. map的成员函数

5.1 map的成员函数介绍

map的构造:

函数声明功能介绍
map<K,V>m()构造一个空的map

map的迭代器:

函数声明功能介绍
begin()end()begin:首元素的位置;end:下一个元素的位置
cbegin()cend()c指const,cbegin和cend指向的内容不能修改
rbegin()rend()反向迭代器,rbegin从end开始,rend从begin开始,其++和–的方向相反
crbegin()crend()与前一个功能相同,但指向的内容不能修改

map的容量与元素访问:

函数名函数声明功能介绍
emptybool empty() const检测map中的元素是否为空,为空返回ture,不为空返回false
sizesize_type size() const返回map中有效元素的个数
operator[]mapped type& operator[] (const key_type& k返回key对应的value
atmapped_type& at (const key_type& k);const mapped_type& at (const key_type& k) const;返回key对应的value

注意:

在元素访问时,at()(该函数不常用)函数,于operator[]功能相同但有一点区别:当key不存在时,operator[]用默认value与key构造键值对然后插入,返回该默认value, at()函数直接抛异常。

map的修改:

函数名函数声明功能介绍
insertpair<iterator,bool> insert (const value_type& val)在map中插入键值对x,注意x是一个键值对,返回值也是键值对;iterator代表新插入元素的位置,bool代表插入成功
erasevoid erase (iterator position)删除position位置上的元素
size_type erase (const key_type& k)删除键值为x的元素
void erase (iterator first, iterator last)删除**[first,last)**区间中的元素
swapvoid swap (map& x)交换两个map中的元素
clearvoid clear()删除map里所有的元素

map的比较:

函数名函数声明功能介绍
key_comp
value_comp

map的操作:

函数名函数声明功能介绍
finditerator find (const key_type& k)搜索map里键等于k的元素,如果找到返回一个映射的迭代器,找不到返回end的迭代器
countsize_type count (const key_type& k) const搜索map里键等于k的元素,找到返回1,找不到返回0
lower_bounditerator lower_bound (const key_type& k)在map里找>=k的元素,返回符合情况的最小键的迭代器
upper_bounditerator upper_bound (const key_type& k)在map里找>k的元素,返回符合情况的最小键的迭代器
equal_rangepair<iterator,iterator>equal_range (const key_type& k)

5.2 insert

insert的返回值是一个pair类模板,而它的参数val也有一个pair类模板。**insert使用pair类模板使得它同时具有插入和搜索的功能。**bool值用来判断map中需要插入的值是否已经存在,iterator是指向val值的迭代器。

在这里插入图片描述

insert的返回值:

如果insert搜索的val值存在,bool值就为false(判断插入失败),iterator会指向map中已经存在的val值;如果insert搜索的val值不存在,bool值就为true(判断插入成功),iterator会指向新插入的val值。

使用insert进行搜索:

由于insert使用pair类模板,所以它也有搜索的功能:

#include<iostream>
#include<map>
#include<string.h>
using namespace std;int main()
{string arr[] = { "张三","李四","王五","张三","张三","李四","张三","李四","王五","张三" };map<string, int> countmap;for (auto& e : arr)//传引用是为了拷贝临时变量浪费资源{pair<map<string, int>::iterator, bool>ret = countmap.insert(make_pair(e, 1));if (ret.second == false){ret.first->second++;}}for (auto& i : countmap){cout << i.first << ":" << i.second << endl;}return 0;
}

在这里插入图片描述

5.3 operator[]

map的operator[]是借助inert来实现的:

在这里插入图片描述

因此map的operator[]同时具有插入、查找和修改的功能:

#include<iostream>
#include<map>
#include<string.h>
using namespace std;int main()
{map<string, string> m;m.insert(make_pair("first", "first"));m.insert(make_pair("second", "second"));cout << "before:" << endl;for (auto& i : m){cout << i.first << " : " << i.second << endl;}m["third"];//插入printf("\n");cout << m["first"] << endl;//查找m["first"] = "x";//修改m["fourth"] = "xxxx";//插入+修改printf("\n");cout << "after:" << endl;for (auto& i : m){cout << i.first << " : " << i.second << endl;}return 0;
}

6. map的特点

stl里的map和set用的是同一颗红黑树来实现的。

set:

在这里插入图片描述

注意:Rb_tree里有一个key_type和一个value_type,但set应该是key和key的映射关系,所以在成员变量里,stl把key_type和value_type都定义了为_key

map:

在这里插入图片描述

而在stl的map里,value_type则定义了一个pair,这样做的目的就是为了复用同一颗红黑树

所以从set和map的底层来看,它们的实现方法分别是:

set<K.>->rb_tree<K, K>

map<K, V>->rb_tree<K ,pair<const K, V>>

这种写法实际上是由stl_tree.h文件中的val模板决定你是key的set,还是key/value的map:

在这里插入图片描述

相关文章:

C++map容器关联式容器

Cmap 1. 关联式容器 vector、list、deque、forward_list(C11)等STL容器&#xff0c;其底层为线性序列的数据结构&#xff0c;里面存储的是元素本身&#xff0c;这样的容器被统称为序列式容器。而map、set是一种关联式容器&#xff0c;关联式容器也是用来存储数据的&#xff0…...

TS-抽象类和静态成员

目录 1&#xff0c;抽象类1&#xff0c;为什么需要抽象类2&#xff0c;抽象成员3&#xff0c;设计模式-模板模式 2&#xff0c;静态成员1&#xff0c;什么是静态成员2&#xff0c;设计模式-单例模式 1&#xff0c;抽象类 1&#xff0c;为什么需要抽象类 有时&#xff0c;某个…...

SharePoint 使用renderListDataAsStream方法查询list超过5000时的数据

问题&#xff1a; 当SharePoint List里的数据超过5000时&#xff0c;如果使用常用的rest api去获取数据&#xff0c;例如 await this.sp.web.lists.getByTitle(Document Library).rootFolder.files.select(*, listItemAllFields).expand(listItemAllFields).filter(listItemA…...

2024042001-计算机网络 - 物理层

计算机网络 - 物理层 计算机网络 - 物理层 通信方式带通调制 通信方式 根据信息在传输线上的传送方向&#xff0c;分为以下三种通信方式&#xff1a; 单工通信&#xff1a;单向传输半双工通信&#xff1a;双向交替传输全双工通信&#xff1a;双向同时传输 带通调制 模拟信号…...

通过java将数据导出为PDF,包扣合并单元格操作

最近项目中需要将查询出来的表格数据以PDF形式导出&#xff0c;并且表格的形式包含横向行与纵向列的单元格合并操作&#xff0c;导出的最终效果如图所示&#xff1a; 首先引入操作依赖 <!--导出pdf所需包--><dependency><groupId>com.itextpdf</groupId&…...

Java内存模式以及volatile关键字的使用

1.Java内存模型 &#xff08;1&#xff09;Java 内存模型&#xff08;Java Memory Model&#xff0c;简称 JMM&#xff09;&#xff0c;它是一个抽象的概念&#xff0c;JMM是和多线程相关的&#xff0c;它是一组规范&#xff0c;描述了一组规则&#xff0c;定义了多线程对共享…...

每日5题Day3 - LeetCode 11 - 15

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int maxArea(int[] height) {//这道题比较特殊&#xff0c;因为两边是任意…...

路由器、交换机和网卡

大家使用VMware安装镜像之后&#xff0c;是不是都会考虑虚拟机的镜像系统怎么连上网的&#xff0c;它的连接方式是什么&#xff0c;它ip是什么&#xff1f; 路由器、交换机和网卡 1.路由器 一般有几个功能&#xff0c;第一个是网关、第二个是扩展有线网络端口、第三个是WiFi功…...

腾讯开源混元DiT文生图模型,消费级单卡可推理

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接…...

shell脚本基础(if/else结构)

命令是双向选择语句&#xff0c;当用户执行脚本时如果不满足if后的表达式也会执行else后的命令&#xff0c;所以有很好的交互性。其结构为&#xff1a; if expression1 then command … command else command … command fi vim ifelse_exam.sh #ifelse_exam.sh #!/bin/bashec…...

万字长文破解 AI 图片生成算法-Stable diffusion (第一篇)

想象一下&#xff1a;你闭上眼睛&#xff0c;脑海中构思一个场景&#xff0c;用简短的语言描述出来&#xff0c;然后“啪”的一声&#xff0c;一张栩栩如生的图片就出现在你眼前。这不再是科幻小说里才有的情节&#xff0c;而是Stable Diffusion——一种前沿的AI图片生成算法—…...

Linux---编辑器vim的认识与简单配置

前言 我们在自己的电脑上所用的编译软件&#xff0c;就拿vs2022来说&#xff0c;我们可以在上面写C/C语言、python、甚至java也可以在上面进行编译&#xff0c;这种既可以用来编辑、运行编译&#xff0c;又可以支持很多种语言的编译器是一种集成式开发环境&#xff0c;集众多于…...

lucene中Collector类、CollectorManager类区分和用法

我的lucene版本是9.10.0&#xff0c;请说明Collector类、CollectorManager类区分和用法&#xff0c;尽量详细点 在 Lucene 9.10.0 中&#xff0c;Collector 类和 CollectorManager 类都是用于搜索结果的收集和处理 Collector 类 Collector 类是一个接口&#xff0c;用于收集…...

Android之给Button上添加按压效果

一、配置stateListAnimator参数实现按压效果 1、按钮控件 <Buttonandroid:id"id/mBtnLogin"android:layout_width"match_parent"android:layout_height"48dp"android:background"drawable/shape_jfrb_login_button"android:state…...

python EEL + vue3.js 项目中如何把组件中的函数提升为全局函数

eel官方示例中暴露的js函数是全局函数&#xff0c;vue中的自定义函数作用域通常都是组件范围内。要让eel.js调用&#xff0c;需要将其升为全局可用。 一般方法有 app.config.globalProperties 或 mixin等。 main.js //main.jsimport { createApp } from vue import App from…...

sqli-labs靶场第十四关

目录 1&#xff1a;分析 找闭合符&#xff1a; 2&#xff1a;开始注入 报错注入&#xff1a; 注入数据库名&#xff1a; 注入表名&#xff1a; 注入列名&#xff1a; 注入具体值&#xff1a; 1&#xff1a;分析 经过我们的实验发现当我们输入的密码后面存在双引号时会报…...

【C语言】6.C语言VS实用调试技巧(1)

文章目录 1.什么是 bug2.什么是调试&#xff08;debug&#xff09;&#xff1f;3.Debug 和 Release4.VS调试快捷键4.1 环境准备4.2 调试快捷键 5.监视和内存观察5.1 监视5.2 内存 1.什么是 bug bug现在一般是指在电脑系统或程序中&#xff0c;隐藏着的一些未被发现的缺陷或问题…...

AIGC行业现在适合进入吗

人工智能、物联网、基因编辑和量子计算等新兴技术领域正在以前所未有的速度发展&#xff0c;这些技术的结合正在重塑我们的世界。在这个充满机遇和挑战的时代&#xff0c;AIGC&#xff08;人工智能、基因编辑和量子计算&#xff09;行业备受关注&#xff0c;许多人都在考虑是否…...

ubuntu CUDA 驱动更新,版本更新,多CUDA版本管理

1 新版本驱动下载 前面介绍过window CUDA驱动更新&#xff0c;但是对于ubuntu 的驱动更新&#xff0c;没有一键操作。 本人笔记本电脑n年前装的CUDA DRIVER仅支持到cuda10.2&#xff0c;实在无法满足这日新月异的科技更新。 左 旧的驱动版本 右 新下载的硬件支持的驱动版本&…...

effective python学习笔记_类与接口

用组合类实现多层结构而不用内置类型 例子&#xff1a;成绩单&#xff0c;存储学生各科成绩多个然后加权重&#xff0c;如果用字典类型会导致字典有多层嵌套结构 思想 当用内置类型如字典元组等结构出现超过二层的多层嵌套结构时&#xff0c;读起来会比较难懂&#xff0c;此时…...

从硬件连接到数据可视化:基于RS485-USB的传感器数据采集全流程解析

1. 硬件连接&#xff1a;从传感器到电脑的物理链路搭建 工业传感器数据采集的第一步&#xff0c;就是建立可靠的物理连接。以常见的星仪压力变送器为例&#xff0c;我们需要解决三个关键问题&#xff1a;传感器供电、信号传输转换、以及电脑端识别。这里我分享几个实际项目中容…...

全新UI 阅后即焚V2正式版系统源码_全开源_安全加密传输

概述 在数字化信息交流日益频繁的今天&#xff0c;如何安全、私密地传输敏感数据&#xff08;如商业机密、登录凭证、个人隐私&#xff09;已成为企业和个人用户共同面临的严峻挑战。传统的即时通讯工具往往存在聊天记录留存、云端备份等安全隐患&#xff0c;难以满足“阅后即…...

NCM转MP3终极指南:3步解锁网易云音乐加密文件

NCM转MP3终极指南&#xff1a;3步解锁网易云音乐加密文件 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经在网易云音乐下载了心爱的歌曲&#xff0c;却发现只能在官方客户端播放&#xff1f;NCM格式的限制让你无法在其他设…...

Page Assist终极指南:在浏览器侧边栏运行本地AI模型的完整解决方案

Page Assist终极指南&#xff1a;在浏览器侧边栏运行本地AI模型的完整解决方案 【免费下载链接】page-assist Use your locally running AI models to assist you in your web browsing 项目地址: https://gitcode.com/GitHub_Trending/pa/page-assist Page Assist是一款…...

基于Google App Engine构建物联网能耗监测系统:从传感器到可视化全栈实践

1. 项目概述与核心价值如果你和我一样&#xff0c;对家里或办公室里那些“电老虎”设备到底消耗了多少能源感到好奇&#xff0c;甚至想为节能减排做点贡献&#xff0c;那么自己动手搭建一个能耗监测系统会是一个极具成就感的项目。这不仅仅是技术上的挑战&#xff0c;更是一种将…...

SteamVR Unity插件实战:解决VR开发中的三大核心挑战

SteamVR Unity插件实战&#xff1a;解决VR开发中的三大核心挑战 【免费下载链接】steamvr_unity_plugin SteamVR Unity Plugin - Documentation at: https://valvesoftware.github.io/steamvr_unity_plugin/ 项目地址: https://gitcode.com/gh_mirrors/st/steamvr_unity_plug…...

PSoC时钟系统深度解析:从架构原理到配置避坑指南

1. 项目概述&#xff1a;为什么PSoC的时钟值得你花时间研究&#xff1f;如果你刚开始接触Cypress&#xff08;现Infineon&#xff09;的PSoC系列微控制器&#xff0c;可能会觉得它的开发环境PSoC Creator功能强大但有点复杂。在众多需要配置的模块里&#xff0c;时钟系统往往是…...

从ZZULIOJ 1138题出发,手把手教你用C语言写一个‘标识符检查器’小工具

从OJ题到实战工具&#xff1a;用C语言打造智能标识符检查器 在编程学习过程中&#xff0c;我们经常遇到各种在线判题系统&#xff08;OJ&#xff09;的练习题&#xff0c;比如判断一个字符串是否为合法的C语言标识符。这类题目看似简单&#xff0c;但如何将其转化为一个真正实用…...

NotebookLM相似文档推荐不准,深度解析向量维度坍缩、跨域语义漂移与上下文窗口截断三大根源问题

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM相似文档推荐不准的系统性现象观察 在实际使用 NotebookLM 过程中&#xff0c;用户频繁反馈其“相似文档推荐”功能存在显著偏差&#xff1a;高语义相关但低表面重合度的文档常被遗漏&#x…...

高通手机刷机救砖不求人:搞懂这10个关键分区,自己就能救活黑砖

高通手机刷机救砖实战指南&#xff1a;10个致命分区解析与精准修复 当你的爱机突然变成一块"黑砖"&#xff0c;屏幕再无反应&#xff0c;甚至连充电指示灯都彻底熄灭时&#xff0c;那种绝望感每个玩机爱好者都深有体会。不同于普通的系统崩溃&#xff0c;黑砖状态意…...