C++笔记打卡第21天(map)

1.map基本概念

  • map中所有元素都是pair
  • pair中第一个元素为key,起到索引作用,第二个元素为value
  • 所有元素都会根据元素的键值自动排序

本质:

  • map/multimap属于关联式容器,底层结构是用二叉树实现

优点:

  • 可以根据key值快速找到value值

map和multimap的区别:

  • map不允许容器中有重复key值元素
  • multimap允许容器中有重复key值元素

2.map构造和赋值

打印Map:

void printMap(map<int,int> &m)
{for(map<int,int>::iterator it = m.begin(); it != m.end(); it++){cout << (*it).first << " " << it->second << endl;}
}

构造:

void test01()
{map<int, int> m;  // <索引,实值> 插入时会按照key值进行排序m.insert(pair<int, int>(1, 10));m.insert(pair<int, int>(3, 30));m.insert(pair<int, int>(2, 20));m.insert(pair<int, int>(4, 40));printMap(m);// 拷贝构造map<int,int> m2(m);// 赋值map<int, int> m3;m3 = m;
}

3.map大小和交换

  • size();
  • empty();
  • swap(st);

4.map插入和删除

  • insert(elem); 在容器中插入元素
  • clear(); 清除所有元素
  • erase(pos); 删除pos迭代器所指的元素,返回下一个元素的迭代器
  • erase(beg, end); 删除[beg, end)的所有元素,返回下一个元素的迭代器
  • erase(elem); 删除容器中值为elem的元素
void test01()
{map<int, int> m;  m.insert(pair<int, int>(1, 10));m.insert(make_pair(2, 10));m.insert(map<int, int>::value_type(3, 30));// 不建议以[]方式插入元素,这种方式主要用来利用key访问valuem[4] = 40;// 删除m.erase(m.begin());m.erase(3);  // 按照key删除!!!m.erase(m.begin(), m.end());m.clear();
}

5.map查找和统计

void test01()
{// 查找map<int, int> m;m.insert(pair<int,int>(1, 10));m.insert(pair<int,int>(3, 30));m.insert(pair<int,int>(2, 20));m.insert(pair<int,int>(4, 40));map<int,int>::iterator pos = m.find(3);if(pos != m.end()){cout << "查到了元素 key=" << (*pos).first << " value=" << (*pos).second << endl;}else{cout << "未找到元素" << endl;}// 统计// map不允许插入重复key元素,count统计而言,结果要么为0,要么为1// multimap的count统计结果可能大于1cout << m.count(3) << endl;
}

6.map容器排序

  • map默认排序规则为:按照key值从小到大排序
  • 利用仿函数,可以降序排列
class MyCompare
{
public:bool operator()(int v1, int v2){return v1 > v2;}
};void test01()
{// 查找map<int, int, MyCompare> m;m.insert(pair<int,int>(3, 30));m.insert(pair<int,int>(3, 30));m.insert(pair<int,int>(2, 20));m.insert(pair<int,int>(4, 40));m.insert(pair<int,int>(5, 50));for(map<int,int, MyCompare>::iterator it = m.begin(); it != m.end(); it++){cout << (*it).first << " " << it->second << endl;}
}

注意:自定义数据类型不能用(int &v1, int &v2),只有内置数据类型才可以。而且对于自定义的数据类型,需要指定排序规则。

7.案例-员工分组

  • 公司今天招聘了10名员工,需要指派每个员工在哪个部门工作
  • 员工信息由姓名、工资组成,部门分为策划、美术、研发
  • 随机给10名员工分配部门和工资
  • 通过multimap进行信息的插入 key(部门编号) value(员工)
  • 分部门显示员工信息
#include<iostream>
#include<string>
#include<vector>
#include<map>
using namespace std;
#define CEHUA 0
#define MEISHU 1
#define YANFA 2class Person
{
public:string m_name;int m_money;
};void creatPerson(vector<Person> &v)
{string name_seed = "ABCDEFGHIJ";for(int i=0; i<10; i++){Person p;p.m_name = "Worker";p.m_name += name_seed[i];p.m_money = rand() % 10000 + 10000;v.push_back(p);}
}void setGroup(vector<Person> &v, multimap<int, Person> &m)
{for(vector<Person>::iterator it=v.begin(); it!=v.end(); it++){// 随机部门编号int deptId = rand() % 3; // 0,1,2m.insert(make_pair(deptId, *it));}
}void showWorker(multimap<int,Person> &m)
{cout << "策划部门:" << endl;multimap<int,Person>::iterator pos = m.find(CEHUA);int count = m.count(CEHUA);int index = 0;for(; pos != m.end() && index < count; pos++, index++){cout << pos->second.m_name << " " << pos->second.m_money << endl;}cout << "-----------------" << endl;cout << "美术部门:" << endl;multimap<int,Person>::iterator pos2 = m.find(MEISHU);int count2 = m.count(MEISHU);int index2 = 0;for(; pos2 != m.end() && index2 < count2; pos2++, index2++){cout << pos2->second.m_name << " " << pos2->second.m_money << endl;}cout << "-----------------" << endl;cout << "研发部门:" << endl;multimap<int,Person>::iterator pos3 = m.find(YANFA);int count3 = m.count(YANFA);int index3 = 0;for(; pos3 != m.end() && index3 < count3; pos3++, index3++){cout << pos3->second.m_name << " " << pos3->second.m_money << endl;}}void test01()
{srand((unsigned int)time(NULL));vector<Person> v;creatPerson(v);multimap<int, Person> m;setGroup(v, m);// 分组显示员工showWorker(m);
}

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

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

相关文章

HTTP慢连接攻击的原理和防范措施

随着互联网的快速发展&#xff0c;网络安全问题日益凸显&#xff0c;网络攻击事件频繁发生。其中&#xff0c;HTTP慢速攻击作为一种隐蔽且高效的攻击方式&#xff0c;近年来逐渐出现的越来越多。 为了防范这些网络攻击&#xff0c;我们需要先了解这些攻击情况&#xff0c;这样…

【笔试】03

FLOPS FLOPS 是 Floating Point Operations Per Second 的缩写&#xff0c;意为每秒浮点运算次数。它是衡量计算机性能的指标&#xff0c;特别是用于衡量计算机每秒能够执行多少浮点运算。在高性能计算领域&#xff0c;FLOPS 被广泛用来评估超级计算机、CPU、GPU 和其他处理器…

2024年区块链链游即将迎来大爆发

随着区块链技术的不断发展和成熟&#xff0c;其应用领域也在不断扩展。其中&#xff0c;区块链链游&#xff08;Blockchain Games&#xff09;作为区块链技术在游戏行业中的应用&#xff0c;备受关注。2024年&#xff0c;区块链链游行业即将迎来爆发&#xff0c;这一趋势不容忽…

Windows10如何关闭Edge浏览器的Copilot

在Windows10更新后&#xff0c;打开Edge浏览器&#xff0c;无论复制什么内容&#xff0c;都会弹出Copilot人工智能插件&#xff0c;非常令人反感&#xff0c;网上搜索的关闭方法都非常麻烦&#xff0c;比如&#xff1a;组策略和注册表。自己摸索得出最简便有效的关闭方法。 1、…

【java毕业设计】 基于Spring Boot+mysql的高校心理教育辅导系统设计与实现(程序源码)-高校心理教育辅导系统

基于Spring Bootmysql的高校心理教育辅导系统设计与实现&#xff08;程序源码毕业论文&#xff09; 大家好&#xff0c;今天给大家介绍基于Spring Bootmysql的高校心理教育辅导系统设计与实现&#xff0c;本论文只截取部分文章重点&#xff0c;文章末尾附有本毕业设计完整源码及…

一致性hash

一、什么是一致性hash 普通的hash算法 (hashcode % size )&#xff0c;如果size发生变化&#xff0c;几乎所有的历史数据都需要重hash、移动&#xff0c;代价非常大&#xff0c;常见的java中的hashmap就是如此。 那如果在hash表扩容或者收缩的时候size能够保持不变&#xff0…

gitee / github 配置git, 实现免密码登录

文章目录 怎么配置公钥和私钥验证配置成功问题 怎么配置公钥和私钥 以下内容参考自 github ssh 配置&#xff0c;gitee的配置也是一样的&#xff1b; 粘贴以下文本&#xff0c;将示例中使用的电子邮件替换为 GitHub 电子邮件地址。 ssh-keygen -t ed25519 -C "your_emai…

线性代数 --- 矩阵的对角化以及矩阵的n次幂

矩阵的对角化以及矩阵的n次幂 &#xff08;特征向量与特征值的应用&#xff09; 前言&#xff1a; 在上一篇文章中&#xff0c;我记录了学习矩阵的特征向量和特征值的学习笔记&#xff0c;所关注的是那些矩阵A作用于向量x后&#xff0c;方向不发生改变的x(仅有尺度的缩放)。线…

VMware 15 安装centos7虚拟机

1. 安装前准备 1.1 下载centos 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 下载需要版本的centos版本 直达链接 centos7.9 &#xff1a; centos-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云 .基础使用的话安装选择这个就行了&#xff0c;大概下载几分钟 2. …

STM32 ADC采样:基础与实践

STM32的ADC采样是嵌入式系统设计中的一个重要环节&#xff0c;它涉及到模拟信号的采集和转换。以下是一篇关于STM32 ADC采样基础与实践的文章&#xff0c;包括一些基础的代码示例。 STM32 ADC采样&#xff1a;基础与实践 引言 STM32系列微控制器因其强大的ADC功能而广泛应用…

uniapp 开发H5中适配底部安全区域不生效的解决方法

在适配底部安全区域时我们通常会使用如下方法 box-sizing: content-box; padding-bottom: 0 !important; padding-bottom: constant(safe-area-inset-bottom) !important; padding-bottom: env(safe-area-inset-bottom) !important; 但是只是加上面的样式会发现并不起作用&…

linux负载均衡 和 系统负载分析笔记

1 负载均衡 1.1 计算负载 1.1.1 PELT算法简介 从Linux3.8内核以后进程的负载计算不仅考虑权重&#xff0c;⽽且跟踪每个调度实体的历史负载情况&#xff0c;该算法称为PELT(Per-entity Load Tracking) 《奔跑吧Linux内核》卷1&#xff1a;基础架构&#xff1b;P505 相关资料…

银河麒麟V10 SP1服务器客户端定时数据同步

银河麒麟V10 SP1服务器客户端定时数据同步 0.概述 当前只测试了将数据从客户端往服务端推送&#xff0c;两个客户端分别推送不同的数据 1.环境 三台电脑均为银河麒麟V10SP1桌面操作系统 服务器IP&#xff1a;192.168.1.51 用户名&#xff1a;wlh 客户端IP&#xff1a;192…

OpenStack云计算(十一)——OpenStack网络管理,验证OpenStack网络资源模型,验证来巩固和加深对OpenStack网络资源模型的理解

项目实训一 【实训题目】 验证OpenStack网络资源模型 【实训目的】 通过验证来巩固和加深对OpenStack网络资源模型的理解。 【实训准备】 &#xff08;1&#xff09;复习Neutron网络资源模型。 &#xff08;2&#xff09;重点理解网络、子网、端口和路由器的概念。 【实…

用 LM Studio 1 分钟搭建可在本地运行大型语言模型平台替代 ChatGPT

&#x1f4cc; 简介 LM Studio是一个允许用户在本地离线运行大型语言模型&#xff08;LLMs&#xff09;的平台&#xff0c;它提供了一种便捷的方式来使用和测试这些先进的机器学习模型&#xff0c;而无需依赖于互联网连接。以下是LM Studio的一些关键特性&#xff1a; 脱机&am…

【笔记django】创建一个app

创建app 错误 raise ImproperlyConfigured( django.core.exceptions.ImproperlyConfigured: Cannot import rules. Check that dvadmin.rules.apps.RulesConfig.name is correct.原因 刚创建的rules的app被手动移动到了dvadmin目录下 而dvadmin/rules/apps.py的内容还是&…

kubeadmin搭建自建k8s集群

一、安装要求 在开始之前&#xff0c;部署Kubernetes集群的虚拟机需要满足以下几个条件&#xff1a; 操作系统 CentOS7.x-86_x64硬件配置&#xff1a;2GB或更多RAM&#xff0c;2个CPU或更多CPU&#xff0c;硬盘30GB或更多【注意master需要两核】可以访问外网&#xff0c;需要…

vue2 点击预览本地 word excle pdf 文件

安装 考虑到三个包加一起的话会比较大&#xff0c;所以拆成了三个包&#xff0c;需要哪个自行安装即可。 //docx文档预览组件 npm install vue-office/docx//excel文档预览组件 npm install vue-office/excel//pdf文档预览组件 npm install vue-office/pdf npm i --save vue…

万界星空科技电机行业MES+商业电机行业开源MES+项目合作

要得出mes系统解决方案在机电行业的应用范围&#xff0c;我们先来看一下传统机电行业的管理难题&#xff1a; 1、 产品标准化程度较低&#xff0c;制造工艺复杂&#xff0c;生产周期较长&#xff0c;产品质量不稳定&#xff1b; 2、 自动化程度低&#xff0c;大多数工序以手工…

【linux】匿名管道|进程池

1.进程为什么要通信&#xff1f; 进程也是需要某种协同的&#xff0c;所以如何协同的前提条件(通信) 通信数据的类别&#xff1a; 1.通知就绪的 2.单纯的数据 3.控制相关的信息 2.进程如何通信&#xff1f; 进程间通信&#xff0c;成本会高一点 进程间通信的前提&#xff0c;先…