C++相关概念和易错语法(24)(map、迭代器分类)

news2024/11/13 18:05:14

1.map

在上篇文章中,我着重介绍了set,由于map和set同源,所以这次我会着重介绍map别于set的地方

(1)模板参数

set是以单一的key作为成员变量,而map是以pair作为成员变量,而pair的first作为key来决定插入位置,second与first一一对应。唯一需要注意的就是map插入pair后不能修改key只能修改value。逻辑上也是必须的,因为map底层的平衡树就是依靠key的大小来建立的,改了key之后这个结点的位置就不对了,整棵树都被毁了。(关联式容器)

(2)构造函数

构造函数和set一样简洁,注意传参仿函数对象和实例化类型要匹配,写不写无所谓,编译器其会自动生成

(3)insert

map的insert和set的一模一样,都是插入数据,返回pair

但是要注意map的insert对象是pair,下面有几种方式:

make_pair

make_pair是一个模板函数,有两个模板参数,可以通过传入参数的类型来推理并实例化,返回对应的匿名pair对象。值得注意的是,pair类型之间能够发生类型转换

这里可以看到,当make_pair的返回值类型和实例化类型不同时,可以发生隐式类型转换,转换的规则遵循first和second分别的转换规则

同样的,当插入pair的类型和map对应的pair类型不相同时,也能发生隐式类型转换。这也进一步验证了pair的本质只是一个存储数据的类型,其实这也依赖pair的operator=函数的支持。

除了make_pair构造以外,还有两种构造,都很好理解

(4)initializer_list

在C++11之后,所有的容器都支持了initializer_list

我们需要抓住当用初始化列表时,最外层{}是初始化列表的标志,({1, 2, 3})标志参数为初始化列表,初始化列表里又可以使用{}标志隐式类型转换,当初始化时可以省略=(如m3)

这里要慢慢消化,可以结合C++相关概念和易错语法(14)(初始化注意事项、vector、编译器向上查找规则)多练习

(5)map里没有流插入,pair也没有流插入,需要自己显式写

(6)find、lower_bound、upper_bound用法和set一模一样,返回值均为迭代器

count、erase返回值均为size_t,标志找到的元素个数

(7)map中iterator的使用

我们要抓住迭代器的本质是模拟指向存储元素的指针,存储的是pair,一个自定义类型,所以operator->就派上了大用场,这也是我们遇到的第一个operator->特殊处理后有实用的地方。

在set中由于是key单独作为存储数据,就没有operator->的概念,直接*it就得到数据了

我们要着重区分pair<iterator, bool>和iterator因为iterator指向的元素也是pair,在调用的时候分不清什么时候用.什么时候用->

(8)operator[]

这可以说是map中的一大难点,在vector、deque中的operator[]可以和*it互换,换句话说,我们之前接触的容器的operator[]本质上和数组的[]没什么区别,是随机迭代器的标配。

但map中是双向迭代器(功能少于随即迭代器)本应没有operator[],但STL让它支持operator[],这也使得它拥有了非同寻常的实现过程和功能。

下面是详细的分析

其中需要注意的是value的默认构造包括自定义类型和内置类型的默认构造,内置类型的默认构造如int(),它的返回值为0(所有编译器都是这样处理的)

理解了上面这些,我们就能利用map实现更多功能了

这已经不是传统opeartor[]的用法了,由于强制支持operator[],map可以向上面那样以很直观的方式插入修改和查找。

(9)范围for

迭代器模拟的是容器元素的指针,范围for返回的是元素的拷贝或引用

两者的底层都是迭代器,但是表层一个是模拟指针,一个是值或值的引用

在map中使用范围for建议都使用const auto&,因为如果返回值给e,那么每次都要构造一个pair,pair中还可能有自定义类型,这样开销太大了,直接用const引用效率会高很多

(10)multimap

multimap和map的区别类似于multiset和set的区别,都是支持多个key的存储,没有去重功能。但multimap没有operator[],因为同一个key可能对应不同value,没有意义。当使用迭代器遍历时同样遵循其元素pair的比较逻辑。

2.迭代器分类 

我们已经接触过了string、vector、list、deque、stack、queue、priority_queue、map、set、multiset、multimap这些基本容器,我们会发现这些容器中有的没有迭代器,有的迭代器支持随意+num,如string,有的就不行,如list。出现这样的原因是迭代器也有它的分类,不同的迭代器有不同的功能,有的算法库的函数只能用特定迭代器才能使用。

随机迭代器:string、vector、deque

双向迭代器:list、map、set、multiset、multimap

无迭代器:stack、queue、priority_queue

不同的迭代器有不同的功能,下面是随机迭代器和双向迭代器的比较

由于两种迭代器的功能差异较大,一种是逐个访问,一种可以跳跃访问,在一些对访问灵活度要求高的算法中,就不能传双向迭代器而只能传随机迭代器,如sort

所以在很多时候我们需要转换容器。看看下面的代码,尝试加深理解


#include <iostream>
#include <algorithm>
#include <map>
#include <vector>

using namespace std;

struct Compare
{
	bool operator()(const pair<string, string>& p1, const pair<string, string>& p2) const
	{
		return p1 < p2;
	}
};

int main()
{
	map<string, string> m;

	m["Huawei"] = "华为";
	m["Xiaomi"] = "小米";
	m["Apple"] = "苹果";
	m["Samsung"] = "三星";

	vector<pair<string, string>> v(m.begin(), m.end());
	sort(v.begin(), v.end(), Compare());

	for (const auto& e : v)
	{
		cout << e.first << " " << e.second << endl;
	}

	return 0;
}

结果是

但是这里有个疑问,为什么可以用map的迭代器来初始化vector?有没有要求呢?这就需要引出另外几个迭代器:输入迭代器

此外还有剩余两个迭代器:输出迭代器、前向迭代器

我们重点区分双向迭代器和随机迭代器,很多容器都是这两种迭代器之一。在特定情况下我们也知道去切换容器。

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

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

相关文章

使用千帆SDK压测千帆大模型平台上的服务

场景 给用户提供千帆标准的压测工具&#xff08;千帆SDK&#xff09;。满足以下使用场景&#xff1a; 测试sft模型部署到算力单元后&#xff0c;实际的性能效果 对比模型压缩后的性能效果 测试预置服务的性能 压测数据准备&#xff08;数据格式规范说明&#xff09; 可用…

DAY05 CSS

文章目录 1 CSS选择器(Selectors)8. 后代(包含)选择器9. 直接子代选择器10. 兄弟选择器11. 相邻兄弟选择器12. 属性选择器 2 伪元素3 CSS样式优先级1. 相同选择器不同样式2. 相同选择器相同样式3. 继承现象4. 选择器不同权值的计算 4 CSS中的值和单位1. 颜色表示法2. 尺寸表示法…

Try ubuntu core (by quqi99)

作者&#xff1a;张华 发表于&#xff1a;2024-07-20 版权声明&#xff1a;可以任意转载&#xff0c;转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明(http://blog.csdn.net/quqi99) try ubuntu core on qemu #ovmf is to ensure compatibility with the re…

电机线电流与转差率曲线理论推导

1.推导基础&#xff1a; #已知正转正拉电流近似为&#xff1a; curr_in_upward (im im*(rm(lml2)*2*np.pi*freq_in*1j)/(r2 l2*2*np.pi*freq_in*1j (1-s)/s*r2))#同工况同负载&#xff0c;正转反拉电流近似为&#xff1a; curr_in_downward (im im*(rm(lml2)*2*np.pi*f…

代码随想录第六十二天 | 739. 每日温度 , 496.下一个更大元素 I ,503.下一个更大元素II

先复习一下栈与队列。栈是先进后出&#xff0c;队列是先进先出。二者都属于STL容器&#xff08;版本是SGI STL&#xff09;中的容器适配器。底层容器完成其所有的工作&#xff0c;对外提供统一的接口&#xff0c;底层容器是可插拔的。如果没有指定底层实现的话&#xff0c;默认…

22-联合体与枚举

22-联合体与枚举 文章目录 22-联合体与枚举一、 联合体1.1 定义和特点1.2 语法1.3 示例1.4 联合体的使用1.5 联合体的使用&#xff1a;检查系统的字节序 二、 枚举2.1 定义和特点2.2 语法2.3 枚举常量的值可以手动修改 一、 联合体 1.1 定义和特点 联合体&#xff08;Union&a…

扩展PyTorch视觉模型

扩展PyTorch视觉模型 目录 扩展PyTorch视觉模型 一、概述 二、扩展基本视觉模型的原因 1. 性能提升 2. 功能扩展 3. 资源管理 三、扩展PyTorch视觉模型的方法 1.修改现有架构 2.应用模型集成技术 3.量化和压缩模型 四、高级技巧与实践 1.自定义训练循环 2.深度模型…

【SpringBoot】 jasypt配置文件密码加解密

目前我们对yml配置文件中的密码都是明文显示&#xff0c;显然这不安全&#xff0c;有的程序员离职了以后可能会做一些非法骚操作&#xff0c;所以我们最好要做一个加密&#xff0c;只能让领导架构师或者技术经理知道这个密码。所以这节课就需要来实现一下。 我们可以使用jasypt…

Gitops-万字保姆级教程-小白也可以轻松学会! (Part 2)

系列文章目录 本文章分为2个部分&#xff1a; Part 1主要涉及Gitlab、Gitlab-Runner、Git-Ci、Sonar-qube-CI阶段 Part 2主要涉及ArgoCD阶段 Gitops-万字保姆级教程-小白也可以轻松学会! (Part 1)-CSDN博客 Gitops-万字保姆级教程-小白也可以轻松学会! (Part 2) 文章目录 目…

【测试能力提升----fastapi框架项目】需求分析

1. FastAPI框架架构 2. 场景分析 2.1 系统分类 单一用户权限系统&#xff08;实用于CMS模型&#xff09;多用户多权限系统&#xff08;实用于多租商户类型&#xff09; 2.2 功能模块 用户登录模块用户管理模块角色权限管理模块基本设置模块日志模块 2.3 需求分析 用户登录…

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-25 ADC模块FEP-DAQ9248采集显示波形方案

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

24年广东“双百社工”招聘报名流程详细步骤

还在蹲公告的宝子们注意啦&#xff01;&#x1f525;24年广东双百社工公告陆续出啦&#xff01;⚠️中山双百社工招聘57人&#xff0c;佛山双百社工招聘135人&#xff0c;其他地区也快了&#xff01;⏰留给我们备考的时间只有一个月左右&#xff0c;想一次上岸的宝子抓紧备考&a…

《专题》numpy科学计算基础库——精细化讲解 <1>

一、什么是numpy库 Numpy(Numerical Python) 是科学计算基础库&#xff0c;提供大量科学计算 相关功能&#xff0c;比如数据统计&#xff0c;随机数生成等。其提供最核心类型为多维数组类型&#xff08;ndarray&#xff09;&#xff0c;支持大量的维度数组与矩阵运算&#xff0…

Java面试题(每日更新)

每日五道&#xff01;学会就去面试&#xff01; 本文的宗旨是为读者朋友们整理一份详实而又权威的面试清单&#xff0c;下面一起进入主题吧。 目录 1.概述 2.Java 基础 2.1 JDK 和 JRE 有什么区别&#xff1f; 2.2 和 equals 的区别是什么&#xff1f; 2.3 两个对象的…

Linux ls命令详解

学习 Linux &#xff0c;本质上是学习在命令行下熟悉使用 Linux 的各类命令&#xff1b; 1. Linux 命令通用格式 命令格式&#xff1a;命令 【-选项】【参数】(个别命令不遵循该格式) 短线&#xff08;-&#xff09;是区分选项和参数的标志&#xff0c;选项用来调整命令的功能…

redis的学习(一):下载安装启动连接

简介 redis的下载&#xff0c;安装&#xff0c;启动&#xff0c;连接使用 nosql nosql&#xff0c;即非关系型数据库&#xff0c;和传统的关系型数据库的对比&#xff1a; sqlnosql数据结构结构化非结构化数据关联关联的非关联的查询方式sql查询非sql查询事务特性acidbase存…

前端系列-6 使用Vue3搭建前端工程与setup语法糖介绍

背景 本文介绍如何使用vue3脚手快速搭建一个前端项目&#xff0c;并对生成的项目结构进行简单介绍&#xff0c;然后介绍setup语法糖。前端入门的同学可基于本文内容快速搭建属于自己的项目。 vue官网资料显示, vue3开发的项目相对vue2, 具有打包后体积变小&#xff0c;极速启动…

【网络】socket和udp协议

socket 一、六个背景知识1、Q1&#xff1a;在进行网络通信时&#xff0c;是不是两台机器在进行通信&#xff1f;2、端口号3、端口号vs进程PID4、目的端口怎么跟客户端绑定的呢&#xff1f;也就是怎么通过目的端口去找到对应的进程的呢&#xff1f;5、我们的客户端&#xff0c;怎…

textblob文本处理、词性分析与情感分析

1 前言 textBlob 是一個简单易用的 NLP库&#xff0c;基于 NLTK 和 pattern库&#xff0c; 提供了文本处理和情感分析等功能。 安装 textblob0.18.0 nltk3.8.1测试环境&#xff1a;Python3.10.9 使用前&#xff0c;先运行下面代码先下载些文件 import nltk nltk.download…

机器学习 | 阿里云安全恶意程序检测

目录 一、数据探索1.1 数据说明1.2 训练集数据探索1.2.1 数据特征类型1.2.2 数据分布1.2.3 缺失值1.2.4 异常值1.2.5 标签分布探索 1.3 测试集探索1.3.1 数据信息1.3.2 缺失值1.3.3 数据分布1.3.4 异常值 1.4 数据集联合分析1.4.1 file_id 分析1.4.2 API 分析 二、特征工程与基…