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:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

专“蜀”盛会!CGT Asia 2024 第六届亚洲细胞与基因治疗创新峰会(成都站)7月火热相邀

在细胞与基因治疗领域&#xff0c;我们正站在一个科技革命的风口上。中国的CGT市场预计将持续快速增长。根据相关分析&#xff0c;预计到2025年整体市场规模将达到25.9亿美元&#xff0c;显示出276%的复合年增长率。这一增长趋势预计将持续到2030年&#xff0c;细胞与基因治疗领…

【利用数组处理批量数据-谭浩强配套】(适合专升本、考研)

无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 完整资料如下&#xff1a;纯干货、纯干货、纯干货&#xff01;&#xff01;…

电子邮箱是什么?付费电子邮箱和免费电子邮箱有什么区别?

注册电子邮箱前&#xff0c;有付费电子邮箱和免费电子邮箱两类选择。付费的电子邮箱和免费的电子邮箱有什么区别呢&#xff1f;区别主要在于存储空间、功能丰富度和售后服务等方面&#xff0c;本文将为您详细介绍。 一、电子邮箱是什么&#xff1f; 电子邮箱就是线上的邮局&a…

等保2.0|定级、备案、整改、测评流程

从个人数据泄露&#xff0c;到企业遭到黑客攻击&#xff0c;网络安全风险已经越发严重。随着互联网的不断发展&#xff0c;数字化经济的普及&#xff0c;信息安全等级保护既是行业标准&#xff0c;又是国家要求。如果企业不做等保&#xff0c;轻则罚款、重则停业。 我国等级保…

练习题(2024/5/15)

1有多少小于当前数字的数字 给你一个数组 nums&#xff0c;对于其中每个元素 nums[i]&#xff0c;请你统计数组中比它小的所有数字的数目。 换而言之&#xff0c;对于每个 nums[i] 你必须计算出有效的 j 的数量&#xff0c;其中 j 满足 j ! i 且 nums[j] < nums[i] 。 以…

【ARMv8/v9 系统寄存器 5 -- ARMv8 Cache 控制寄存器 SCTRL_EL1 使用详细介绍】

关于ARM Cache 详细学习推荐专栏&#xff1a; 【ARM Cache 专栏】 【ARM ACE Bus 与 Cache 专栏】 文章目录 ARMv8/v9 Cache 设置寄存器ARMv8 指令 Cache 使能函数测试代码 ARMv8/v9 Cache 设置寄存器 关于寄存器SCTRL_EL1 的详细介绍见文章&#xff1a;【ARMv8/v9 异常模型入…

Nacos+GateWay 搭建微服务架构

文章目录 1.当前项目架构分析1.请求多个模块的方式1.请求renren-fast模块开发环境生产环境 2.请求sunliving-commodity模块1.使用环境变量资源路径的方式2.开发环境 dev.env.js3.生产环境 prod.env.js 3.文件上传请求 sunliving-service模块1.请求后端接口&#xff08;开发环境…

Leetcode - 周赛397

目录 一&#xff0c;3146. 两个字符串的排列差 二&#xff0c;3147. 从魔法师身上吸取的最大能量 三&#xff0c;3148. 矩阵中的最大得分 四&#xff0c;3149. 找出分数最低的排列 一&#xff0c;3146. 两个字符串的排列差 本题就是求同一个字符在两个字符串中的下标之差的…

一物一码数字化营销进军调味品行业,五丰黎红“星厨俱乐部”火啦!

近日&#xff0c;由五丰黎红联合纳宝科技精心打造的小程序“星厨俱乐部”火啦&#xff01;一经上线就吸引了大量用户注册和参与&#xff0c;可以说取得了非常成功的市场反馈&#xff0c;那究竟是一个什么样的小程序&#xff0c;竟然有这么大的吸引力呢&#xff1f; 介绍小程序之…

C++ requires关键字简介

requires 是 C20 中引入的一个新关键字&#xff0c;用于在函数模板或类模板中声明所需的一组语义要求&#xff0c;它可以用来限制模板参数&#xff0c;类似于 typename 和 class 关键字。 requires关键字常与type_traits头文件下类型检查函数匹配使用&#xff0c;当requires后…

视频监控系统中,可变码率和固定码率对录像文件存储大小的影响,如何配置比较好?

目录 一、问题描述 二、视频监控的录像文件计算 &#xff08;一&#xff09;计算方法 &#xff08;二&#xff09;计算工具 三、原因分析 &#xff08;一&#xff09;检查配置 1、IPCa配置 2、IPCb配置 3、录像文件存储大小的理论值 &#xff08;二&#xff09;实际情…

五丰黎红引领新营销模式:布局一物一码数字化营销,提高调味品销量和复购率

调味品行业的销售渠道主要有餐饮、家庭消费和食品加工&#xff0c;按销售额的占比约为6&#xff1a;3&#xff1a;1&#xff0c;餐饮行业是调味品行业的供需主力。在餐饮行业中&#xff0c;“大厨”这一角色具有十分重要的地位。因此&#xff0c;借助大厨的力量成为了许多调味品…

汇聚荣科技:如何有效为拼多多店铺引流?

在电商竞争激烈的今天&#xff0c;为拼多多店铺引流是每个店主必须面对的挑战。有效的引流策略不仅能增加店铺曝光度&#xff0c;还能提升转化率&#xff0c;促进销量增长。 一、社交媒体营销 利用微信、微博等社交平台进行推广&#xff0c;可以通过发布产品信息、用户评价和促…

985大学电子信息专硕,考C语言+数据结构!中央民族大学25计算机考研考情分析!

中央民族大学&#xff08;Minzu University of China&#xff09;坐落于北京市学府林立的海淀区&#xff0c;南邻国家图书馆&#xff0c;北依中关村科技园&#xff0c;校园环境典雅&#xff0c;古朴幽美&#xff0c;人文氛围浓郁&#xff0c;具有鲜明的民族特色。由北京市、国家…

Java--初识类和对象

前言 本篇讲解Java类和对象的入门版本。 学习目的&#xff1a; 1.理解什么是类和对象。 2.引入面向对象程序设计的概念 3.学会如何定义类和创建对象。 4.理解this引用。 5.了解构造方法的概念并学会使用 考虑到篇幅过长问题&#xff0c;作者决定分多次发布。 面向对象的引入 J…

GAME101-Lecture07学习

前言 今天主要讲shading&#xff08;着色&#xff09;。在讲着色前&#xff0c;要先讲图形中三角形出现遮挡问题的方法&#xff08;深度缓存或缓冲&#xff09;。 先采样再模糊错误&#xff1a;对信号的频谱进行翻译&#xff08;在这期间会有频谱的混叠&#xff09;&#xff…

Anaconda安装-超详细版(2024)

扫盲&#xff1a;先装Python还是先装anaconda? 安装anaconda即可&#xff0c;不需要单独装python anaconda 是一个python的发行版&#xff0c;包括了python和很多常见的软件库, 和一个包管理器conda。 一、下载Anaconda 安装包&#xff08;官网和国内镜像资源&#xff09; …

【强化学习】DQN类算法的一些理解

一、DQN算法为什么要使用两个网络&#xff1f; DQN算法通常包含两个网络&#xff1a;一个是评估网络training_network&#xff0c;另一个是目标网络target_network。这两个网络的结构和初始权重是相同的&#xff0c;但它们的权重是不同步更新的。使用两个网络的原因是为了稳定…

vue3.0+antdv的admin管理系统vue-admin-beautiful推荐

前言 几年前&#xff0c;笔者自学了vue这一优秀的前端框架&#xff0c;但苦于没项目练手&#xff0c;无意间发现了vue-admin-beautiful这一优秀的前端集成框架。当时就使用它做了一很有意思的小项目---终端监控云平台&#xff0c;实现了前端和后台的整体功能。整体方案介绍参见…

洛谷P1364 医院设置

P1364 医院设置 题目描述 设有一棵二叉树&#xff0c;如图&#xff1a; 其中&#xff0c;圈中的数字表示结点中居民的人口。圈边上数字表示结点编号&#xff0c;现在要求在某个结点上建立一个医院&#xff0c;使所有居民所走的路程之和为最小&#xff0c;同时约定&#xff0c…