C++学习 --map
目录
1, 什么是map
2, 创建map
2-1, 标准数据类型
2-2, 自定义数据类型
2-3, 其他创建方式
3, 操作map
3-1, 赋值
3-2, 插入元素(insert)
3-2-1, 插入标准数据类型
3-2-1, 插入自定义数据类型
3-3, 查询元素
3-3-1, 标准数据类型查询
3-3-1-1,迭代器访问
3-3-1-2, 键访问
3-3-2, 自定义数据类型查询
3-3-2-1, 迭代器访问
3-3-2-2, 键访问
3-4, 移除元素
3-4-1, 通过键移除
3-4-2, 通过迭代器移除
3-5, 清空
3-6, 获取长度
3-7, 查找元素
3-8, 判断map是否为空
3-9, 统计键数量
3-10, map互换
4, multimap
1, 什么是map
map中存储的元素是pair, 元素会根据pair的key自动升序排序, 通过key快速找到对应的value
分为map和multimap两种, 前者不允许key重复, 后者允许key重复
由于不是标准数据类型, 需要包含头文件#include <map>才能使用
2, 创建map
通过map<数据类型, 数据类型> 对象名, 可创建map, 数据类型可以是标准数据类型, 也可以是自定义类型
2-1, 标准数据类型
//map中元素键数据类型为string, 值数据类型为int
map<string, int> m1;
2-2, 自定义数据类型
Myclass1 mc_1("张三", 10);
Myclass2 mc_2("李四", 20);
//map中元素键数据类型为MyClass, 值数据类型为MyClass2
map<Myclass1, Myclass2> m1;
2-3, 其他创建方式
//通过拷贝构造方式, 将一个已存在的m1, 拷贝给m2
map<string, int> m2(m1);
//通过迭代器方式, 将一个已存在的m1, 拷贝给m2
//m1.begin()指向m1的第一个元素, m1.begin()指向m1的最后一个元素的下一个元素
map<string, int> m3(m1.begin(), m1.end());
3, 操作map
3-1, 赋值
由于map是一个容器, 只支持将一个map赋值给另外一个map
map<string, int> m1;
map<string, int> m2;
m2 = m1;
3-2, 插入元素(insert)
通过对象名.insert(pair对象), 向map中插入元素, 不支持虚插(push_back)
3-2-1, 插入标准数据类型
map<string, int> m1;
//下面三种都可以插入数据
//注意:只能插入pair对象
m1.insert(pair<string, int>("aaa", 1));
m1.insert(make_pair("bbb", 2));
m1.insert(map<string, int>::value_type("ccc", 3));
3-2-1, 插入自定义数据类型
//重定义仿函数, 注意后面加了const,是个常函数
class MyCompare
{
public:bool operator()(const Myclass1& m1, const Myclass1& m2) const{return m1.m_name > m2.m_name;}
};Myclass1 mc_1("aaa", 1);
Myclass2 mc_2("bbb", 2);
//由于key值是自定义数据类型,这里需要重定义仿函数, 数据加上MyCompare
map<Myclass1, Myclass2, MyCompare> m1;
//下面三种都可以插入数据
//注意:只能插入pair对象
m1.insert(pair<Myclass1, Myclass2>(mc_1, mc_2));
m1.insert(make_pair(mc_1, mc_2));
m1.insert(map<Myclass1, Myclass2>::value_type(mc_1, mc_2));
3-3, 查询元素
可通过迭代器或者对象名[key]的方式
3-3-1, 标准数据类型查询
3-3-1-1,迭代器访问
#include <iostream>
#include <string>
#include <map>using namespace std;void print_map(map<string, int>& m)
{for (map<string, int>::iterator it = m.begin(); it != m.end(); it++){cout << "键:" << it->first << " " << "值:" << it->second << endl;}
}int main()
{map<string, int> m1;//下面三种都可以插入数据//注意:只能插入pair对象m1.insert(pair<string, int>("aaa", 111));m1.insert(make_pair("bbb", 222));m1.insert(map<string, int>::value_type("ccc", 333));print_map(m1);system("pause");return 0;
}
3-3-1-2, 键访问
#include <iostream>
#include <string>
#include <map>using namespace std;int main()
{map<string, int> m1;//下面三种都可以插入数据//注意:只能插入pair对象m1.insert(pair<string, int>("aaa", 111));m1.insert(make_pair("bbb", 222));m1.insert(map<string, int>::value_type("ccc", 333));cout << "通过键获取元素:" << m1["aaa"] << endl;system("pause");return 0;
}
3-3-2, 自定义数据类型查询
3-3-2-1, 迭代器访问
#include <iostream>
#include <string>
#include <map>using namespace std;class Myclass1
{
public:Myclass1(string name, int age) : m_name(name), m_age(age) {};string m_name;int m_age;
};class Myclass2
{
public:Myclass2(string name, int age) : m_name(name), m_age(age) {};string m_name;int m_age;
};//仿函数重载
class MyCompare
{
public:bool operator()(const Myclass1& m1, const Myclass1& m2) const{return m1.m_name < m2.m_name;}
};//注意map中加上了MyCompare
void print_map_1(map<Myclass1, Myclass2, MyCompare>& m)
{for (map<Myclass1, Myclass2, MyCompare>::iterator it = m.begin(); it != m.end(); it++){cout << "键:" << it->first.m_name << " " << it->first.m_age << endl;cout << "值:" << it->second.m_name << " " << it->first.m_age << endl;}
}int main()
{Myclass1 mc_1("aaa", 1);Myclass2 mc_2("bbb", 2);Myclass1 mc_3("ccc", 3);Myclass2 mc_4("ddd", 4);Myclass1 mc_5("eee", 5);Myclass2 mc_6("fff", 6);//由于key值是自定义数据类型,这里需要重定义仿函数, 数据加上MyComparemap<Myclass1, Myclass2, MyCompare> m1;//下面三种都可以插入数据//注意:只能插入pair对象m1.insert(pair<Myclass1, Myclass2>(mc_1, mc_2));m1.insert(make_pair(mc_3, mc_4));m1.insert(map<Myclass1, Myclass2>::value_type(mc_5, mc_6));print_map_1(m1);system("pause");return 0;
}
3-3-2-2, 键访问
在已知键的情况下, 通过对象名[键], 获取元素
#include <iostream>
#include <string>
#include <map>using namespace std;class Myclass1
{
public://通过键获取元素,需定义默认构造函数:Myclass1() {}Myclass1() {};Myclass1(string name, int age) : m_name(name), m_age(age) {};string m_name;int m_age;
};class Myclass2
{
public://通过键获取元素,需定义默认构造函数:Myclass1() {}Myclass2() {};Myclass2(string name, int age) : m_name(name), m_age(age) {};string m_name;int m_age;
};//仿函数重载
class MyCompare
{
public:bool operator()(const Myclass1& m1, const Myclass1& m2) const{return m1.m_name < m2.m_name;}
};int main()
{Myclass1 mc_1("aaa", 1);Myclass2 mc_2("bbb", 2);Myclass1 mc_3("ccc", 3);Myclass2 mc_4("ddd", 4);Myclass1 mc_5("eee", 5);Myclass2 mc_6("fff", 6);//由于key值是自定义数据类型,这里需要重定义仿函数, 数据加上MyComparemap<Myclass1, Myclass2, MyCompare> m1;//下面三种都可以插入数据//注意:只能插入pair对象m1.insert(pair<Myclass1, Myclass2>(mc_1, mc_2));m1.insert(make_pair(mc_3, mc_4));m1.insert(map<Myclass1, Myclass2>::value_type(mc_5, mc_6));//通过键访问cout << "通过键获取元素:" << m1[mc_3].m_name << " " << m1[mc_3].m_age << endl;system("pause");return 0;
}
3-4, 移除元素(erase)
3-4-1, 通过键移除
通过对象名.erase(键), 指定从map中移除元素
m1.erase("bbb");
3-4-2, 通过迭代器移除
通过对象名.erase(迭代器), 指定从map中移除元素
map<string, int>::iterator it = m1.begin();
//移动迭代器的位置
it = it++;
m1.erase(it);
3-5, 清空(clear)
通过对象名.clear(), 清空map中的元素
m1.clear();
//通过指定迭代器区间进行清空
m1.erase(m1.begin(), m1.end());
3-6, 获取长度(size)
通过对象名.size(), 获取map的元素个数
m1.size();
3-7, 查找元素(find)
通过对象名.find(键), 查找map中是否在存在元素, 存在返回对应iterator, 不存在返回对象名.end()
//存在返回对应的iterator
map<string, int>::iterator ret = m1.find("aaa");if (ret != m1.end())
{cout << "键:" << ret->first << " 值:" << ret->second << endl;
}
else
{cout << "查找的键不存在" << endl;
}
3-8, 判断map是否为空(empty)
通过对象名.empty(), 判断map是否为空, 为空返回1, 不为空返回0;
m1.empty();
3-9, 统计键数量(count)
通过对象名.count(键), 统计map中指定的键的个数,要么为1,要么为0
m1.count("aaa");
3-10, map互换(swap)
通过对象名1.swap(对象名2), 可交换两个map的元素
m1.swap(m2);
4, multimap
通过multimap<数据类型, 数据类型> 对象名, 创建multimap, multimap支持键重复
#include <iostream>
#include <string>
#include <map>using namespace std;void print_map(multimap<string, int>& m)
{for (multimap<string, int>::iterator it = m.begin(); it != m.end(); it++){cout << "键:" << it->first << " " << "值:" << it->second << endl;}
}int main()
{multimap<string, int> mul_m1;mul_m1.insert(make_pair("aaa", 111));mul_m1.insert(make_pair("aaa", 112));mul_m1.insert(make_pair("aaa", 113));print_map(mul_m1);system("pause");return 0;
}
相关文章:
C++学习 --map
目录 1, 什么是map 2, 创建map 2-1, 标准数据类型 2-2, 自定义数据类型 2-3, 其他创建方式 3, 操作map 3-1, 赋值 3-2, 插入元素(insert) 3-2-1, 插入标准数据类…...

基于Qt QList和QMap容器类示例
## QList<T> QList<T>容器是一个数组列表,特点如下: 1.大多数情况下可以用QList。像prepend()、append()和insert()这种操作,通常QList比QVector快的多。这是因为QList是基于index标签存储它的元素项在内存中(虽然内存不连续,这点与STL的list 是一样的),比…...

Flask学习一:概述
搭建项目 安装框架 pip install Flask第一个程序 from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return "Hello World"if __name__ __main__:app.run()怎么说呢,感觉还不错的样子。 调试模式 if __name__ __main__:a…...
LeetCode:689. 三个无重叠子数组的最大和(dp C++)
目录 689. 三个无重叠子数组的最大和 题目描述: 实现代码与解析: dp 原理思路: 滑动窗口: 原理思路: 689. 三个无重叠子数组的最大和 题目描述: 给你一个整数数组 nums 和一个整数 k ,找…...

Leetcode—206.反转链表【简单】
2023每日刷题(三十三) Leetcode—206.反转链表 头插法实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* reverseList(struct ListNode* head) {if(head NULL…...
Linux - 内存 - 预留内存占用分析
说明 Linux启动log中会显示平台的内存信息,公司SOC平台,物理DRAM实际size是128M,但是启动log中total size不足128MB,并且预留内存(82272K reserved)过多,启动log如下: Memory: 480…...

Java学习之路 —— Java高级
文章目录 前言1. 单元测试2. 反射2.1 获取Class对象的三种方式2.2 获取类的构造器的方法2.3 获取类的成员变量2.4 获取类的成员方法2.5 反射的作用 3. 注解3.1 自定义注解3.2 注解的原理3.3 元注解3.4 注解的解析 4. 动态代理5. 总结 前言 终于走到新手村的末端了,…...

git使用及常用命令
在初入公司中,若使用的是git管理工具,需要做以下步骤: 1,常用命令在: (1),git config --global user.name xxx(名字) //若不设置 那么下次提交代码时会报错 其次该设置名字和…...
vue 学习 -- day36(分析工程结构)
//引入的不再是Vue构造函数了,引入的是一个名为createApp的工厂函数 import { createApp } from vue import App from ./App.vue //创建应用实例对象——app(类似于之前Vue2中的vm,但app比vm更“轻”,它少了很多属性和方法) const app creat…...

SQL Injection
SQL Injection SQL injection(SQL注入),通过在输入字段或URL查询参数中执行SQL命令,导致对数据库的未经授权的访问。如果SQL注入成功,未经授权的人可能会读取、创建、更新甚至删除数据库表的记录 举个例子:…...

【Go入门】 Go搭建一个Web服务器
【Go入门】 Go搭建一个Web服务器 前面小节已经介绍了Web是基于http协议的一个服务,Go语言里面提供了一个完善的net/http包,通过http包可以很方便的搭建起来一个可以运行的Web服务。同时使用这个包能很简单地对Web的路由,静态文件,…...

VS 将 localhost访问改为ip访问
项目场景: 使用vs进行本地调试时需要多人访问界面,使用ip访问报错 问题描述 vs通过ip访问报错 虚拟机或其它电脑不能正常打开 原因分析: 原因是vs访问规则默认是iis,固定默认启动地址是localhost 解决方案: 1.vs项目启动之后会出现这个 右…...
app使用
font-face{font-family:‘kaishu’; src: url(data:application/font-ttf;charsetutf-8;base64,AAEAAAASAQAABAAgRFNJR5PpVzIAAAEsAAAacEdTVUIzhvftAAAbnAAAAXBPUy8yY8pHoQAAHQwAAABWY21hcAsTB9YAAB1kAADD5GN2dCAvAiIAADhSAAAA5pmcGdt/siFHQAA5OQAAAOiZ2FzcAAXAAkAAOiIAAAAEGds…...

【迅搜01】安装运行并测试XunSearch
安装运行并测试XunSearch 这回的新系列,我们将学习到的是一个搜索引擎 迅搜 XunSearch 的使用。这个搜索引擎在 PHP 圈可能还是有一点名气的,而且也是一直在更新的,虽说现在 ElasticSearch 已经是实际上的搜索引擎霸主了,而且还有…...

Mac电脑VSCode配置PHP开发环境
1.安装 PHP 首先,打开终端,安装 Homebrew,输入如下命令: $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 安装了 Homebrew 之后,你可以使用下面的…...

SpirngBoot + Vue 前后端分离开发工具代码
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Java从入门到精通 ✨特色专栏…...

【数据结构初阶】单链表(附全部码源)
单链表 1,单链表的概念及结构2,单链表的实现2.1初始化内容(所需文件,接口)2.2申请结点2.3打印单链表2.4尾插2.5头插2.6尾删2.7头删2.8查找2.9在pos位置之后插入2.10在pos位置前面插入2.11删除pos之后的值2.12删除pos位…...

数据治理入门
处理模式 模式名称常见场景常见框架批处理夜间几个小时,无人值守hive spark datax流处理7*24H一直运行,无人值守maxwell, flink, flume, kafka即席处理人机交互接口访问 web页面 数据治理的意义 数据质量低:数据错误,不准确或不…...

uniapp 微信小程序登录 新手专用 引入即可
预览 第一步导入插件 在引入的页面的登录按钮下拷贝一下代码 <template><view class"content"><button type"primary" click"login">微信登录</button></view><TC-WXlogin :wxloginwxlogin /> </templ…...

PMCW体制雷达系列文章(4) – PMCW雷达之抗干扰
说明 本文作为PMCW体制雷达系列文章之一,主要聊聊FMCW&PMCW两种体制雷达的干扰问题。事实上不管是通信领域还是雷达领域,对于一切以电磁波作为媒介的信息传递活动,干扰是无处不在的。近年来,随着雷达装车率的提高,…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...