C++回顾(二十五)—— map/multimap容器

news2024/11/23 15:46:44

25.1 map/multimap的简介

  • map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对。它提供基于key的快速检索能力。
  • map中key值是唯一的。集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。
  • map的具体实现采用红黑树变体的平衡二叉树的数据结构。在插入操作和删除操作上比vector快。
  • map可以直接存取key所对应的value,支持[]操作符,如map[key]=value
  • multimap与map的区别:map支持唯一键值,每个键只能出现一次;而multimap中相同键可以出现多次。multimap不支持[]操作符
  • 需要添加头文件:`#include

25.2 map/multimap构造

  • map/multimap采用模板类实现,对象的默认构造形式:
    map<T1,T2> mapTT;
    multimap<T1,T2> multimapTT;
    如:
map<int, char> mapA;
map<string,float> mapB;

//其中T1,T2还可以用各种指针类型或自定义类型
map(const map &mp); //拷贝构造函数

25.3 map的使用

(1)map的插入与迭代器

map.insert(…); //往容器插入元素,返回pair<iterator,bool>
在map中插入元素的三种方式:
假设 map<int, string> mapStu;

  • 一、通过pair的方式插入对象:mapStu.insert( pair<int,string>(3,"小张") );

  • 二、通过make_pair的方式插入对象:mapStu.inset(make_pair(-1, “校长-1”));

  • 三、通过value_type的方式插入对象:mapStu.insert( map<int,string>::value_type(1,"小李") );

  • 四、通过数组的方式插入值:mapStu[3] = “小刘"; mapStu[5] = “小王";

  • 前三种方法,采用的是insert()方法,该方法返回值为pair<iterator,bool>

  • 第四种方法非常直观,但存在一个性能的问题。插入3时,先在mapStu中查找主键为3的项,若没发现,则将一个键为3,值为初始化值的对组插入到mapStu中,然后再将值修改成“小刘”。若发现已存在3这个键,则修改这个键对应的value。

在这里插入图片描述
在这里插入图片描述

(2)map对象的拷贝构造与赋值

  • map& operator=(const map &mp); //重载等号操作符
  • map.swap(mp); //交换两个集合容器

(3)map的大小

  • map.size(); //返回容器中元素的数目
  • map.empty();//判断容器是否为空

(4)map的删除

  • map.clear(); //删除所有元素
  • map.erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
  • map.erase(beg,end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
  • map.erase(keyElem); //删除容器中key为keyElem的对组。

(5)map的查找

  • map.find(key); 查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回map.end();
  • map.count(keyElem); //返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap来说,值可能大于1。

完整示例代码:

#include <iostream>
#include <map>

using namespace std;

int main()
{
	map<int, string> m;     //key是int类型  value是string类型

	m.insert(pair<int, string>(3, "aa"));     //通过pair对组(组合一组数据)插入
	m.insert(pair<int, string>(1, "zz"));

	m.insert(make_pair(5, "cc"));             //通过make_pair组合一对数据插入
	m.insert(make_pair(4, "ff"));

	m.insert(map<int, string>::value_type(6, "hh"));   //通过map内部静态成员函数插入
	m.insert(map<int, string>::value_type(2, "dd"));

	m[8] = "uu";                              //map重载了[]运算符
	m[7] = "ee";

	//遍历结果 按照key自动排序
	for (map<int, string>::iterator it = m.begin(); it != m.end(); it++)
	{
		//it指向map的一个结点,一个结点就是一个pair对象,即it指向pair对象,pair对象有两个成员,first和second
		cout << "学号 " << it->first << "   姓名 " << it->second << endl; 
	}

	//前三种插入方法,如果数据已经存在则返回错误;第四种方法,如果数据存在则覆盖(不太安全)
	pair<map<int, string>::iterator, bool> p = m.insert(make_pair(5, "qq"));
	if (p.second == false)
	{
		cout << "插入失败" << endl;    //返回的迭代器指向已经存在的结点
		cout << "学号 " << p.first->first << "   姓名 " << p.first->second << endl;
	}
	else
	{
		cout << "插入成功" << endl;
	}

	m[3] = "www";       //直接把原有的数据覆盖
	for (map<int, string>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "学号 " << it->first << "   姓名 " << it->second << endl; 
	}

	cout << "map删除指定的位置" << endl;
	m.erase(m.begin());
	for (map<int, string>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "学号 " << it->first << "   姓名 " << it->second << endl; 
	}

	cout << "map删除区间" << endl;
	m.erase(--(m.end()), m.end());
	for (map<int, string>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "学号 " << it->first << "   姓名 " << it->second << endl; 
	}

	cout << "map删除具体元素" << endl;
	m.erase(4);    //根据k值删除
	for (map<int, string>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "学号 " << it->first << "   姓名 " << it->second << endl; 
	}


	return 0;
}

运算结果:
在这里插入图片描述

(6)multimap

  • Multimap:1个key值可以对应多个value

Multimap 案例:
公司有销售部 sale (员工2名)、技术研发部 development (1人)、财务部 Financial (2人)
人员信息有:姓名,年龄,电话、工资等组成
通过 multimap进行 信息的插入、保存、显示
分部门显示员工信息

示例代码:

#include <iostream>
#include <map>

using namespace std;

class Employee
{
private:
	int id;
	string name;
public:
	Employee(int i, string n)
	{
		id = i;
		name = n;
	}
	void show()
	{
		cout << "工号:" << id << "    姓名:" << name << endl; 
	}
};

int main()
{
	Employee e1(1, "aa");
	Employee e2(2, "aa");
	Employee e3(3, "aa");
	Employee e4(4, "aa");
	Employee e5(5, "aa");
	Employee e6(6, "aa");
	Employee e7(7, "aa");
	Employee e8(8, "aa");

	multimap<string, Employee> m;

	//销售部门有三个员工
	m.insert(make_pair("sale", e1));
	m.insert(make_pair("sale", e2));
	m.insert(make_pair("sale", e3));

	//研发部门一个员工
	m.insert(make_pair("development", e4));

	//财务部门4个员工
	m.insert(make_pair("financial", e5));
	m.insert(make_pair("financial", e6));
	m.insert(make_pair("financial", e7));
	m.insert(make_pair("financial", e8));

	cout << m.count("financial") << endl;

	for (multimap<string, Employee>::iterator it = m.begin(); it != m.end(); it++)
	{
		cout << "部门:" << it->first << endl;
		it->second.show();
	}

	return 0;
}

运行结果:
在这里插入图片描述

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

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

相关文章

BN,LN,IN,GN的理解和用法

绿色区域表示将该区域作用域(四种方法都贯穿了w,h维度)&#xff0c;即将该区域数值进行归一化&#xff0c;变为均值为0&#xff0c;标准差为1。BN的作用区域时N,W,H,表示一个batch数据的每一个通道均值为0&#xff0c;标准差为1&#xff1b;LN则是让每个数据的所有channel的均值…

新一代跨平台云备份工具Duplicacy

什么是 Duplicacy &#xff1f; Duplicacy 是一款云备份软件&#xff0c;通过 Duplicacy 可以将视频&#xff0c;图片&#xff0c;文件&#xff0c;注册表等数据备份到云端。Duplicacy 通过客户端加密和最高级别的重复数据删除功能&#xff0c;将您的文件备份到许多云存储。 安…

SQL查漏补缺

有这么一道题&#xff0c;先看题目&#xff0c;表的内容如下 显示GDP比非洲任何国家都要高的国家名称(一些国家的GDP值可能为NULL)。 错误的查询&#xff1a; SELECT name FROM bbcWHERE gdp > ALL (SELECT gdp FROM bbc WHERE region Africa)正确的查询&#xff1a; SE…

C++ 11 pair

class pair 可将两个 value视为一个单元。C标准库内多处用到了这个 class 。尤其是容器 map、multimap、unordered_map和 unordered_multimap就是使用 pair 来管理其以 key/value pair形式存在的元素。任何函数如果需要返回两个 value&#xff0c;也需要用到 pair&#xff0c;例…

Windows使用Stable Diffusion时遇到的各种问题和知识点整理(更新中...)

Stable Diffusion安装完成后&#xff0c;在使用过程中会出现卡死、文件不存在等问题&#xff0c;在本文中将把遇到的问题陆续记录下来&#xff0c;有兴趣的朋友可以参考。 如果要了解如何安装sd&#xff0c;则参考本文《Windows安装Stable Diffusion WebUI及问题解决记录》。如…

九龙证券|盘前直接腰斩,银行巨头紧急“拔网线”!美股银行股又崩了?

见证历史了&#xff0c;又有一家银行巨子倒下&#xff1f; 美股银行股团体暴降 上一交易日暴降超60%的硅谷银行持续面对腥风血雨。盘前&#xff0c;硅谷银行跌幅超50%&#xff0c;随后&#xff0c;公司宣布盘前暂停交易&#xff0c;等待刊发消息。 而最新消息显现&#xff0c…

Spring Cloud Gateway 超时、CORS配置 | Spring Cloud 17

一、Http超时配置 Spring Cloud Gateway 可以为所有路由配置 Http 超时&#xff08;响应和连接&#xff09;&#xff0c;并为每个特定路由覆盖设置。 1.1 全局超时 配置全局 http 超时&#xff1a; connect-timeout必须以毫秒为单位指定。response-timeout必须指定为 java.…

[qiankun+nuxt]子应用请求本地文件报错404

前言 目前公司的前端架构是qiankunnuxt做的微前端项目 问题说明 在子应用中&#xff0c;前端需要模拟一些数据&#xff0c;方便后期演示调整而不需要重新打包 所以将一些数据存储到了本地的json文件中&#xff0c;但是获取时报了404的错误&#xff0c;找不到该文件。 页面报错…

Springboot是什么

目录 为什么会要用springboot 1、之前 2、现在 springboot优点 springboot四大核心 自动装配介绍 1、自动装配作用是什么 2、自动装配原理 springboot starter是什么 1、starter作用 2、比如&#xff1a;我们想搭建java web框架 3、starter原理 SpringBootApplica…

ROS小车研究笔记3/11/2023:多点导航及其源码实现

多点导航操作 打开导航launch文件 roslaunch turn_on_wheeltec_robot navigation.launch rviz 在rviz里&#xff0c;选择publish point在地图上点击标记目标点。在标记多个目标点后小车会按标记顺序依次在各个目标点中往返 多点导航对于话题MarkerArray。需要在rviz中使marke…

网页基本标签、图像标签、链接标签、块内元素和块元素、列表标签、表格标签

一、网页基本标签 标题标签 段落标签 未写段落标签前&#xff0c;文本没有按照想要的格式排列显示 写段落标签后&#xff1a; 每句都是一段&#xff0c;所以句与句距离比较宽 换行标签 同一段&#xff0c;只是把文字换行&#xff0c;所以比较紧凑 水平线标签 字体样式标签 …

【深度学习】神经网络和深度学习--卷积和池化的作用

深度学习通常指训练大型深度的神经网络的过程。 与传统的神经网络模型相比&#xff0c;深度学习模型在结构上与之非常相似&#xff1b;不同的是&#xff0c;深度学习模型的“深度”更大&#xff0c;“深度”的体现就是神经网络层数多&#xff0c;神经网络每一层的结点数多。 本…

# 关于Docker容器中时间时区问题的测试

关于Docker容器中时间时区问题的测试 文章目录关于Docker容器中时间时区问题的测试1 基础知识1.1 /etc/localtime1.2 /etc/timezone2 我在gitlab中遇到的问题与解决方法3 ubuntu官方镜像时区相关问题的测试3.0 官方原版测试3.1 不设置任何参数测试3.2 只设置TZ"Asia/Shang…

Spring Cloud Gateway 监控、多网关实例路由共享 | Spring Cloud 18

一、监控 Actuator是Spring Boot提供的用来对应用系统进行监控的功能模块&#xff0c;借助于Actuator开发者可以很方便地对应用系统某些监控指标进行查看、统计等。 Actuator的核心是端点Endpoint。 Endpoint可以让我们监视应用程序并与其交互。Spring Boot包含许多内置端点…

rapidcsv 写csv文件实例

csv实质是一个文本文件&#xff0c;可以使用rapidcsv写文件操作&#xff0c;如下实例&#xff1a; 第一行实质是从-1行开始&#xff0c;列是从0开始 #include "rapidcsv.h" #include <string> using namespace std; void CMFCApplication1Dlg::OnBnClickedBu…

【flask】URL和视图映射

目录 首页 传参 URL数据类型 get传参 首页 url与视图函数的映射是通过app.route()装饰器实现的。 只有一个斜杠代表的是根目录——首页。 传参 URL传参是通过<参数名称>的形式进行传递。URL中有几个参数&#xff0c;在视图函数中也要指定几个参数 from flask im…

WattOS:一个稳又快的轻量级 Linux 发行版

导读Linux 领域里的每个人不是听说过就是使用过某个轻量级的 Linux 发行版。大家都知道我们不断追求的是&#xff1a;占用内存少&#xff0c;配置资源要求低&#xff0c;包含一个轻量级的桌面环境&#xff08;或者窗口管理器&#xff09;&#xff0c;并且提供和其他发行版相似的…

从官网下载/处理 MNIST 数据集,并构造CNN网络训练

这里写自定义目录标题MNIST 网络 测试用1. 导入所需要的模块2. 下载 MNIST 数据集3. 读取 MNIST 数据集MNIST 网络 测试用 1. 导入所需要的模块 import sys sys.path.append(../../) from zfdplearn import fdutils, fdtorch_net, fddata import os import os.path as path i…

# 数据完整性算法在shell及python中的实践

数据完整性算法在shell及python中的实践 文章目录数据完整性算法在shell及python中的实践1 预备知识1.1 摘要算法1.2 报文&#xff08;数据&#xff09;完整性校验1.3 python byte类型字符串与普通字符串区别2 传统方法&#xff08;散列函数&#xff09;2.1 在shell中实践2.2 在…

python调试模块ipdb

1. 调试python ipdb是用来python中用以交互式debug的模块&#xff0c;可以直接利用pip安装; 其功能类似于pycharm中 python控制台&#xff0c; 而使用ipdb 的优点&#xff0c;便是直接在代码中调试&#xff0c; 避免了在python控制台&#xff0c;或者重新设置一些简单变量。…