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:

在这里插入图片描述

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

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

相关文章

【开发】模型部署笔记

目录 模型量化 模型量化 1、模型量化优点 低精度模型表示模型权重数值格式为FP16&#xff08;半精度浮点&#xff09;或者INT8&#xff08;8位定点整数&#xff09;&#xff0c;但是目前低精度往往就指代INT8。常规精度模型则一般表示模型权重数值格式为FP32&#xff08;32位…

策略模式详解

策略模式 1 概述 先看下面的图片&#xff0c;我们去旅游选择出行模式有很多种&#xff0c;可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿&#xff0c;开发需要选择一款开发工具&#xff0c;当然可以进行代码开发的工具有很多&#xff0c;可以选择Idea进…

gitlab webhook触发jenkins任务

配置jenkins 安装gitlab插件 配置jenkins job 选择gitlab webhook触发 在高级中生成token 代码仓设置 新增webhook 配置webhook 测试连接 缺点&#xff0c;不能带gitLab事件的参数&#xff01;&#xff01;&#xff01;

Spark RDD案例:统计网站每月访问量

这个项目利用Spark技术&#xff0c;通过统计网站访问记录中的日期信息&#xff0c;实现了对每月访问量的统计和排序。通过分析数据&#xff0c;我们可以了解到不同月份的网站访问情况&#xff0c;为进一步优化网站内容和推广策略提供数据支持。 使用Spark统计网站每月访问量 …

Apache2.4和PHP8的量子纠缠

Apache不建议你用&#xff0c;PHP建议使用

一种基于电场连续性的高压MOSFET紧凑模型,用于精确表征电容特性

来源&#xff1a;A Compact Model of High-Voltage MOSFET Based on Electric Field Continuity for Accurate Characterization of Capacitance&#xff08;TED 24年&#xff09; 摘要 本文提出了一种新的高压MOSFET&#xff08;HV MOS&#xff09;紧凑模型&#xff0c;以消…

【hana】hana1.0多容器常用命令

基础命令 数据库 连接数据库 hdbsql -u system -p {passwd} -i 02 -d {dbname}查询所有数据库 SELECT DATABASE_NAME, ACTIVE_STATUS FROM M_DATABASES;停止数据库&#xff0c;会修改数据库状态为No ALTER SYSTEM STOP DATABASE testdb; 启动数据库&#xff0c;会修改数据…

多线程的代码案例

目录 单例模式 饿汉模式 懒汉模式 阻塞队列 生产者消费者模型意义: 阻塞队列使用方法 实现阻塞队列 阻塞队列实现生产者消费者模型 定时器 实现简单的定时器 工厂模式 线程池 为啥呢? 从池子里面取 比 创建线程 效率更高 线程池的创建 怎么填坑 ThreadPoolExec…

图解堆排序【一眼看穿逻辑思路】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 目录 1、堆的概念2、实现堆排序前的准备工作3、堆排序的思路3.1 第一步3.2 第二步 4、结语 1、…

音视频捕捉技术:LCC382 SDI采集卡深度解析

在日新月异的多媒体时代&#xff0c;高质量的音视频采集已成为众多领域不可或缺的一环。为此&#xff0c;灵卡科技精心打造了LCC382 —— 一款集高效性、灵活性与前沿技术于一身的SDI输入与环出、HDMI输出音视频采集卡&#xff0c;旨在满足从专业直播、视频会议到医疗影像、安防…

网页版Figma汉化

最近学习Figma&#xff0c;简单介绍一下网页版Figma的汉化方法 1.打开网址&#xff1a;Figma软件汉化-Figma中文版下载-Figma中文社区 2.下载汉化插件离线包 解压汉化包 3.点开谷歌的管理扩展程序 4.点击加载已解压的扩展程序&#xff0c;选择刚刚解压的包 这样就安装好了汉化…

QT状态机2-含终止状态的嵌套状态机

#include "MainWindow.h" #include "ui_MainWindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)

前馈神经网络FNN、多层感知机MLP和反向传播推导

目录 一、前馈神经网络FNN 激活函数的使用 二、多层感知机MLP MLP的典型结构 多层感知机MLP的特点 和前馈神经网络FNN的区别 三、传播推导 1、前向传播(Forward propagation) &#xff08;1&#xff09;输入层到隐藏层 &#xff08;2&#xff09;隐藏层到输出层 2、…

Java面试八股之WeakHashMap的工作原理

简述WeakHashMap的工作原理 弱键&#xff08;Weak Keys&#xff09;&#xff1a; WeakHashMap 的键&#xff08;keys&#xff09;是通过 WeakReference 弱引用进行封装的。弱引用是一种特殊的引用类型&#xff0c;它不会阻止所引用的对象被垃圾收集器回收。这意味着&#xff…

冥想训练具体方法有哪些|流静冥想

冥想是一种身体的放松和敏锐的警觉性相结合的状态。 每日练习的好处远不止你花在集中注意力的那几分钟。桑托雷利是建在乌斯特的马萨诸塞大学医学院的减压诊所的所长&#xff0c;她也是《自愈》的作者&#xff0c;她说&#xff1a;"冥想是一种工具&#xff0c;通过练习&a…

云手机的优缺点分析

云手机&#xff0c;作为云计算领域的创新&#xff0c;致力于提供更为灵活的移动设备体验&#xff0c;特别适用于那些希望在不同设备之间无缝切换的用户。虽然云手机带来了一系列优势&#xff0c;但也伴随着一些挑战&#xff0c;比如网络延迟可能会影响用户体验&#xff0c;特别…

网络安全|隐藏IP地址的5种不同方法

隐藏计算机的IP地址在互联网在线活动种可以保护个人隐私&#xff0c;这是在线活动的一种常见做法&#xff0c;包括隐私问题、安全性和访问限制内容等场景。那么如何做到呢?有很5种方法分享。每种方法都有自己的优点和缺点。 1. 虚拟网络 当您连接到虚拟服务器时&#xff0c;您…

Dubbo配置上的一些概念

对于dubbo在spring中我们可能看到有如下配置&#xff08;可参考Schema 配置参考手册 | Apache Dubbo&#xff09;&#xff1a; dubbo:application:id: dubbo-account-examplename: dubbo-account-example# 是否启用 Dubbo 的 QoS&#xff08;Quality of Service&#xff09;服…

Blender雕刻建模_笔刷

1.雕刻模式 雕刻Scuplt&#xff0c;一种常用的建模方式 -选中物体&#xff0c;进入雕刻模式 -重构网格&#xff08;修改体素大小&#xff0c;点击重构网格&#xff09;给物体添加更多面 -选择笔刷&#xff0c;雕刻 -退出雕刻模式 2.重构网格 一种按体积的细分方式&#xf…