map系列的使用

news2024/10/11 13:55:50

map和multimap参考文档 

map和multimap参考文档icon-default.png?t=O83Ahttps://legacy.cplusplus.com/reference/map/

map类的介绍

  • map的声明如下,Key就是map底层关键字的类型,T是map底层T的类型。但要注意:map的 key 与 T 是封装在std::pair<Key,T>存储键值对应数据。这就类似于封装的map中又将封装key 与 T 到pair中;
  • set默认要求Key支持小于比较,如果不支持或者需要的话可以自行实现仿函数传给第⼆个模版参数。
  • map底层存储数据的内存是从空间配置器申请的。⼀般情况下,我们都不需要传后两个模版参数。
  • map底层是用红黑树实现,增删查改效率是 O(logN) (利用的是AVL),迭代器遍历是走的中序,所以是按key有序顺序遍历的。

pair类型介绍

template <class T1, class T2> 
	struct pair {
		T1 first;
		T2 second;

		//类型() 就是默认类型的构造
		pair(const T1& t1 = T1(), const T2& t2 = T2())
			:first(t1)
			, second(t2)
		{}
	};

	template<class T1, class T2>
	inline pair<T1, T2> make_pair(const T1& t1, const T2& t2)
	{
		return (pair<T1, T2>(t1, t2));
	};

注意:

  • make_pair(c++11才支持) 类似于一个函数,返回值是pair 类型的;这种函数十分好用,在传参要用到pair时就可以 用make_pair 结构; 

    map<int, int> m1;
    m1.insert(make_pair(1, 1));

  • map底层的红⿊树节点中的数据,使⽤pair<Key, T>存储键值对数据。

map的构造

  •  map的支持双向迭代器,遍历默认按key的升序顺序(仿函数可以自组定义)
  • 因为底层是⼆叉搜索树,迭代器遍历⾛的中序;支持迭代器就意味着支持范围for。
  • map支持修改value数据不支持修改key数据,修改关键字数据,破坏了底层搜索树的结构。

map的构造这里关注以下几个接口(其他可以自主查看map参考文档):

// empty (1) ⽆参默认构造
explicit map (const key_compare& comp = key_compare(),
const allocator_type& alloc = allocator_type());
// range (2) 迭代器区间构造
template <class InputIterator>
map (InputIterator first, InputIterator last,
const key_compare& comp = key_compare(),
const allocator_type& = allocator_type());
// copy (3) 拷⻉构造
map (const map& x);
// initializer list (5) initializer 列表构造
map (initializer_list<value_type> il
const key_compare& comp = key_compare(),
const allocator_type& alloc = allocator_type());

参考代码:

//map<string, string> dict = { { "left", "左" }, { "right", "右" }, { "string", "字符串" }, { "insert", "插入" } };
	map<string, string> dict{ { "left", "左" }, { "right", "右" }, { "string", "字符串" }, { "insert", "插入" } };

	map<int, int> v1{{ 1, 2 }, { 3, 4 }, { 5, 6 } };
	map<int, int> m3(v1.begin(), v1.end());

map的增删查

  • map增接口,插入的pair键值对数据,跟set所有不同,但是查和删的接口只用关键字key跟set是完全类似的。而且关键字key是不能修改的;
  • 不过find返回iterator,不仅仅可以确认key在不在,还找到key映射的value,同时通过迭代还可以修改value。  

下面的和set极其相似,具体的在上一篇set讲咯,这里就不重复了;

// 单个数据插⼊,如果已经key存在则插⼊失败,key存在相等value不相等也会插⼊失败
pair<iterator,bool> insert (const value_type& val);
// 列表插⼊,已经在容器中存在的值不会插⼊
void insert (initializer_list<value_type> il);
// 迭代器区间插⼊,已经在容器中存在的值不会插⼊
template <class InputIterator>
void insert (InputIterator first, InputIterator last);
// 查找k,返回k所在的迭代器,没有找到返回end()
iterator find (const key_type& k);
// 查找k,返回k的个数
size_type count (const key_type& k) const;
// 删除⼀个迭代器位置的值
iterator erase (const_iterator position);
// 删除k,k存在返回0,存在返回1
size_type erase (const key_type& k);
// 删除⼀段迭代器区间的值
iterator erase (const_iterator first, const_iterator last);
// 返回⼤于等k位置的迭代器
iterator lower_bound (const key_type& k);
// 返回⼤于k位置的迭代器
const_iterator lower_bound (const key_type& k) const;

map的应用 

  • 数据结构初阶阶段,为了控制随机指针,我们将拷贝结点链接在原节点的后⾯解决,后⾯拷贝节点还得解下来链接,⾮常⿇烦。
  • 这⾥我们直接让{原结点,拷⻉结点}建⽴映射关系放到map中,控制随机指针会⾮常简单⽅便,这⾥体现了map在解决⼀些问题时的价值,完全是降维打击。

. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=O83Ahttps://leetcode.cn/problems/copy-list-with-random-pointer/

用c语言写 

struct Node* copyRandomList(struct Node* head) {
	 struct Node* cur = head;
        while(cur)
        {
            //自主创立映射
           struct Node* copy = (struct Node*)malloc(sizeof(struct Node));
            copy->val = cur->val;

            copy->next = cur->next;
            cur->next = copy;

            cur = copy->next;
        }

        cur = head;
        while(cur)
        {
//控制 random 的指向
            if(cur->random == NULL)
            {
                cur->next->random = NULL;
            }
            else 
            {
                cur->next->random = cur->random->next;
            }

            cur = cur->next->next;
        }

       struct Node* copytail = NULL;
       struct Node* copyhead = NULL;

        cur = head;
        while(cur)
        {
            if(copytail == NULL)
            {
                copytail = copyhead = cur->next;
            }else{
                copytail->next = cur->next;
                copytail = copytail->next;
            }

            cur = cur->next->next;
        }

        return copyhead;
    
}

 {原结点,拷⻉结点}建⽴映射关系放到map中:

 

class Solution {
public:
    Node* copyRandomList(Node* head) {
        map<Node*, Node*> m1;

        Node* cur = head;
        Node* copyhead = nullptr; 
        Node* copytail = nullptr;

        while(cur)
        {
            if(copyhead == nullptr)
            {
                copyhead = copytail = new Node(cur->val);
            }else{
                copytail->next = new Node(cur->val);
                copytail = copytail->next;
            }

            m1[cur] = copytail;

            cur = cur->next;
        }

        cur = head;
        Node* copy =  copyhead;
        while(cur)
        {
            if(cur->random == nullptr)
            {
                copy->random = nullptr;
            }else{
                copy->random = m1[cur->random];
            }

            copy = copy->next;
            cur = cur->next;
        }
        return copyhead;
    }
};

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

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

相关文章

第二十一篇:你知道直播,小区视频点播等是怎么实现的吗?(组播协议)

你知道直播&#xff0c;小区视频点播等是怎么实现的吗&#xff1f;其实现就是运用了组播&#xff01; 信息从信息源发送给组播成员&#xff0c;肯定不能全网无选择的传播&#xff0c;那不是组播&#xff0c;那就是广播了&#xff0c;路由器不支持广播&#xff0c;却支持组播&a…

Kylin系统根分区扩容步骤

问题背景 工作中&#xff0c;有时候Linux操作系统的根分区空间不足&#xff0c;我们需要将已安装的系统根分区进行扩容。那么该如何进行操作呢&#xff1f;我以VMware虚拟机上的Kylin系统为例&#xff0c;进行了详细的实验操作。具体详情请见下面的文章。 虚拟机扩容硬盘 首…

【高等代数笔记】线性空间(二十四下半部分-二十六)

3.23 子空间的运算 【推论1】 dim ⁡ ( V 1 V 2 ) dim ⁡ V 1 dim ⁡ V 2 ⇔ V 1 ∩ V 2 0 \dim(\textbf{V}_1\textbf{V}_2 )\dim\textbf{V}_1\dim\textbf{V}_2\Leftrightarrow\textbf{V}_1\cap\textbf{V}_2\textbf{0} dim(V1​V2​)dimV1​dimV2​⇔V1​∩V2​0 3.24 子…

Redis 高可用方案

Redis 高可用性&#xff08;High Availability&#xff09;是指在 Redis 系统中实现持续的可用性&#xff0c;即使在发生硬件故障或其他意外情况下&#xff0c;系统仍能保持运行。 1 常用方案 为了实现 Redis 的高可用性&#xff0c;以下是几种常用方案&#xff1a; 1.1 使用…

学习threejs,THREE.MeshBasicMaterial网格材质、THREE.MeshLambertMaterial漫反射材质

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.MeshBasicMaterial网…

Spring Boot课程答疑:技术难题一网打尽

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

Nuxt.js 应用中的 kit:compatibility 事件钩子详解

title: Nuxt.js 应用中的 kit:compatibility 事件钩子详解 date: 2024/10/11 updated: 2024/10/11 author: cmdragon excerpt: kit:compatibility 是处理浏览器兼容性问题的有效工具。正如本篇文章中所述,合理地利用这一钩子可以提升用户体验,并确保应用在不同环境中都能…

回南天,即使没有除湿机,也能除湿

前几天收到网友私信&#xff0c;询问烘干机干衣吹热风&#xff0c;这个比较好理解&#xff0c;热气吹到衣服上加速水分蒸发。但空调除湿为什么不吹热风了&#xff0c;而吹冷风呢&#xff1f;以及除湿机的原理等的问题。 因为我在南京总是觉得干&#xff0c;加湿器24小时不停&a…

嵌入式面试——FreeRTOS篇(八) Tickless低功耗

本篇为&#xff1a;FreeRTOS Tickless 低功耗模式篇 一、低功耗模式简介 1、低功耗介绍 答&#xff1a; 很多应用场合对于功耗的要求很严格&#xff0c;比如可穿戴低功耗产品、物联网低功耗产品等&#xff1b;一般MCU都有相应的低功耗模式&#xff0c;裸机开发时可以使用MCU的…

【射频通信电子线路基础第八讲】射频小信号放大器

一、射频放大器 不失真放大射频信号 主要要求&#xff1a;最佳增益、噪声系数、功率、带宽——设计统筹考虑 能量转换器 有源器件&#xff08;晶体管&#xff09;是核心 二、射频放大器的位置 三、射频放大器的分类 1、导通角与基于工作点 2、基于信号大小 小信号模式&a…

海报设计用什么软件?一分钟掌握创意海报设计技巧

回想当初&#xff0c;什么都不懂的小编&#xff0c;随便在网上搜教程想自学海报设计&#xff0c;面对满屏的天花乱坠辅导班广告&#xff0c;打起了退堂鼓。 现在已经摸透了怎么完成海报制作设计的小编&#xff0c;准备来给同样想要学习海报设计的新手&#xff0c;分享能够在一…

Cherno游戏引擎笔记(73~90)

------- scene viewport ---------- 》》》》做了两件事&#xff1a;设置视口和设置相机比例 》》》》为什么要设置 m_ViewportSize 为 glm::vec2 而不是 ImVec2 ? 因为后面需要进行 ! 运算&#xff0c;而 ImVec2 没有这个运算符的定义&#xff0c;只有 glm::vec2 有这个运算…

Python JSON 操作中的四个高效小窍门

JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&#xff0c;在各种应用场景中扮演着重要角色。Python 中处理 JSON 数据非常便捷&#xff0c;主要通过内置的 json 模块来实现。本文将详细介绍如何使用 Python 进行 JSON 数据的操作&…

python list, tuple dict,set的区别 以及**kwargs 的基本用法

在python中, list, tuple, dict, set有什么区别, 主要应用在什么样的场景? 定义: list:链表,有序的项目, 通过索引进行查找,使用方括号”[]”; tuple:元组,元组将多样的对象集合到一起,不能修改,通过索引进行查找, 使用括号”()”; dict:字典,字典是一组键(key)和值(value…

MacOS编译和安装Poco库的方法

1.从官网git下载最新的poco源代码 在/usr/local路径下创建Poco文件夹&#xff0c;克隆Poco源代码 sudo git clone -b poco-1.13.3-release https://github.com/pocoproject/poco.git2.等了一会后&#xff0c;报错啦&#xff01;&#xff01;&#xff01; error: RPC failed…

耳机座接口会被TYPE-C取代吗?

耳机座接口&#xff0c;即传统的3.5mm耳机插孔&#xff0c;一直以来都是音频设备的标准配置。然而&#xff0c;随着科技的发展和用户需求的变化&#xff0c;TYPE-C接口逐渐崭露头角&#xff0c;成为许多设备的主流选择。这一趋势引发了一个重要问题&#xff1a;耳机座接口会被T…

前缀和算法——优选算法

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;游戏、数据结构、c语言基础、c学习、算法 一、什么是前缀和&#xff1f; 前缀和是指从数组的起始位置到某一位置&#xff08;或矩阵的某个区域&#xff09;的所有元素的和。这种算法通过预处理数组或矩阵&#xff0c;…

[Git] 演示回退命令reset的三种模式soft、hard、mixed详解

前言 目录 git reset soft hard mixed git reset --soft commitId git reset --hard commitId git reset --mixed commitId git reset soft 移动本地库HEAD指针 hard 移动本地库HEAD指针 重置暂存区 重置工作区 mixed 移动本地库HEAD指针重置暂存区 执行reset命令后…

秒杀|基于springBoot的秒杀系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 摘要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及…