STL常见容器(map/multimap容器)---C++

STL常见容器目录:

  • 8.map/ multimap容器
    • 8.1 map基本概念
    • 8.2 map构造和赋值
    • 8.3 map大小和交换
    • 8.4 map插入和删除
    • 8.5 map查找和统计
    • 8.6 map容器排序
      • 8.6.1 内置类型排序
      • 8.6.2 自定义类型排序
      • 8.6.3 自定义和内置类型混合排序

在这里插入图片描述

8.map/ multimap容器

两者基本一致,除了以下区别:

map和multimap区别

  • map不允许容器中有重复key值元素;
  • multimap允许容器中有重复key值元素。
    注意:对于value值都可以重复

8.1 map基本概念

简介:

  • map中所有元素都是pair
  • pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)(可以根据key值快速找到value值);
  • 所有元素都会根据元素的键值自动排序

本质:

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

8.2 map构造和赋值

构造:

  • map<T1, T2> mp; //map默认构造函数:
  • map(const map &mp); //拷贝构造函数

赋值:

  • map& operator=(const map &mp); //重载等号操作符

总结:map中所有元素都是成对出现,插入数据时候要使用对组

8.3 map大小和交换

函数原型:

  • size(); //返回容器中元素的数目
  • empty(); //判断容器是否为空
  • swap(st); //交换两个集合容器

8.4 map插入和删除

函数原型:

  • insert(elem); //在容器中插入元素(四种方式)。
  • clear(); //清除所有元素
  • erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
  • erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
  • erase(key); //删除容器中值为key的元素

示例:

#include <map>//包含头文件(multimap头文件一样)void Printmap(map<int, int>m)//按照key值排序(默认升序)
{for (map<int,int>::iterator it = m.begin(); it != m.end(); it++) {cout << "key=" << (*it).first << " value= " << it->second << endl;;}cout << endl;
}
void test01()
{map<int, int>m;//四种插入方式(多用前两种)m.insert(pair<int, int>(9, 90));//pair匿名对象m.insert(make_pair(8, 80));m.insert(map<int, int>::value_type(7, 70));m[6] = 60;//key=6,value=60Printmap(m);
cout << "方括号访问元素:" << m[9] << endl;//可利用[key]访问对于value值m.erase(7);//删除key=7的元素(若无相应key值,则不删除)Printmap(m);}

在这里插入图片描述

8.5 map查找和统计

函数原型:

  • find(key); //查找key是否存在,若存在,返回该键的元素的迭代器若不存在,返回set.end();
  • count(key); //统计key的元素个数(map返回0或1;mutimap可能大于1

8.6 map容器排序

主要技术点:

  • 利用仿函数,可以改变排序规则。(默认升序)

8.6.1 内置类型排序

示例:

#include <map>class MyCompare {
public:bool operator()(int v1, int v2) const {return v1 > v2;//降序}
};void test02()
{//默认从小到大排序//利用仿函数实现从大到小排序map<int, int, MyCompare> m;m.insert(make_pair(1, 10));m.insert(make_pair(2, 20));m.insert(make_pair(3, 30));m.insert(make_pair(4, 40));m.insert(make_pair(5, 50));for (map<int, int, MyCompare>::iterator it = m.begin(); it != m.end(); it++) {cout << "key:" << it->first << " value:" << it->second << endl;}
}

输出;

key:5 value:50
key:4 value:40
key:3 value:30
key:2 value:20
key:1 value:10

8.6.2 自定义类型排序

示例:

class Person
{
public:Person(string name, int age){this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;};
//仿函数
class MyCompare
{
public:bool operator()(const Person& v1, const Person& v2) const{//按照年龄进行排序  降序return v1.m_Age > v2.m_Age;}
};void test03()
{//指定排序规则 map<Person,Person, MyCompare> m;//改变排序顺序需要在插入数据之前改变//插入自定义数据Person p1("刘备", 23);Person p2("关羽", 27);Person p3("张飞", 25);Person p4("赵云", 21);m.insert(make_pair(p1,p1));m.insert(make_pair(p2,p2));m.insert(make_pair(p3,p3));m.insert(make_pair(p4,p4));for (map<Person, Person, MyCompare>::iterator it = m.begin(); it != m.end(); it++) {cout << "姓名:" << it->second.m_Name << " 年龄:" << it->second.m_Age << endl;}
}

输出:

姓名:关羽 年龄:27
姓名:张飞 年龄:25
姓名:刘备 年龄:23
姓名:赵云 年龄:21

8.6.3 自定义和内置类型混合排序

示例:

#include <map>
class Person
{
public:Person(string name, int age){this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;};void test04()
{map<int,Person> m;//若要改变排序顺序需要在插入数据之前改变//因为map排序是按照key值排序,此处key为整型,编译器可自行排序(升序)//降序参照8.6.1//插入自定义数据Person p1("刘备", 23);Person p2("关羽", 27);Person p3("张飞", 25);Person p4("赵云", 21);m.insert(make_pair(p1.m_Age,p1));m.insert(make_pair(p2.m_Age, p2));m.insert(make_pair(p3.m_Age, p3));m.insert(make_pair(p4.m_Age, p4));for (map<int, Person>::iterator it = m.begin(); it != m.end(); it++) {cout << "姓名:" << it->second.m_Name << " 年龄:" << it->second.m_Age << endl;}
}

输出:

姓名:赵云 年龄:21
姓名:刘备 年龄:23
姓名:张飞 年龄:25
姓名:关羽 年龄:27

总结:

  • 利用仿函数可以指定map容器的排序规则;
  • 对于自定义数据类型,map必须要指定排序规则,同set容器;

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

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

相关文章

用node写后端环境运行时报错Port 3000 is already in use

解决方法:关闭之前运行的3000端口,操作如下 1.WindowR输入cmd确定,打开命令面板 2.查看本机端口详情 netstat -ano|findstr "3000" 3.清除3000端口 taskkill -pid 41640 -f 最后再重新npm start即可,这里要看你自己项目中package.joson的启动命令是什…

Flink:动态表 / 时态表 / 版本表 / 普通表 概念区别澄清

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

Python+PySide6实现一个选择文件并做处理的GUI办公小工具(完整代码)

目录 专栏导读背景安装注意事项完整代码结尾专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专栏求订阅 🕷 此外还…

天翼云登录参数JavaSrcipt逆向

天翼云登录参数 password 、comParam_curTime、comParam_seqCode、comParam_signature JavaSrcipt逆向 目标网站 https://m.ctyun.cn/wap/main/auth/login?redirect/my 目标参数 要逆向的有 password、comParam_curTime、comParam_seqCode、comParam_signature 四个参数 …

安卓使用ExoPlayer出现膨胀类异常

1.导包 implementation com.google.android.exoplayer:exoplayer-core:2.15.1implementation com.google.android.exoplayer:exoplayer-ui:2.15.1 2.在Androidifest.xml加入权限&#xff0c;我这里加了忘了与读写权限 <uses-permission android:name"android.permissio…

Tomcat服务部署、优化

一 Tomcat的基本介绍 Tomcat概念 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试 JSP 程序的首选。 当在一台机器上配置好Apache 服务器…

VMwareWorkstation17.0虚拟机搭建WindowsXP虚拟机(完整安装步骤详细图文教程)

VMwareWorkstation17.0虚拟机搭建WindowsXP虚拟机&#xff08;完整安装步骤详细图文教程&#xff09; 一、Windows XP1.Windows XP简介2.Windows XP 的下载地址 二、配置 Windows XP 虚拟机运行环境1.新建虚拟机2.选择类型配置3.插入WinXP光盘映像文件(ISO)4.选择操作系统5.命名…

Home Assistant:基于Python的智能家居开源系统详解

Home Assistant&#xff1a;基于Python的智能家居开源系统详解 在数字化和智能化的时代&#xff0c;智能家居系统成为了现代家庭的新宠。它们能够让我们更加方便地控制家中的各种设备&#xff0c;实现自动化和个性化的居住体验。其中&#xff0c;Home Assistant作为一款基于Pyt…

【二分】二分模板+二分题目

一、朴素二分 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/binary-search/description/ int left 0, right nums.…

【leetcode】随机链表的复制

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 点击查看题目 思路: struct Node* copyRandomList(struct Node* head) {struct Node* curhead;//1.copy原链…

MWC 2024丨美格智能CEO杜国彬出席中国联通创新成果发布会并发表主题演讲

2月26日&#xff0c;中国联通在MWC2024 巴塞罗那期间举办了以“算网为基&#xff0c;智领未来”为主题的创新成果发布会&#xff0c;集中展示最新的创新成果与最佳实践。 中国通信标准化协会理事长闻库、GSMA首席财务官Louise Easterbrook、中国联通副总经理梁宝俊、华为ICT销…

每日一“类“:深入理解Qt的心脏《QObject》

Qt框架以其强大的跨平台能力和丰富的用户界面元素而广受开发者欢迎&#xff0c;而QObject类无疑是Qt框架心脏的所在。本文将深入探讨QObject&#xff0c;揭示其提供的核心功能以及如何在Qt项目中有效利用这个基类。 核心功能 信号与槽 Qt独特的信号与槽机制是其事件通信的基…

AWS 认证报名考试流程

AWS认证的考试包括&#xff0c;可以申请线上或者线下考试。 考试类型 线上&#xff1a; 优点&#xff1a;方便快捷无需通勤&#xff0c;随时约随时考&#xff0c;基本上每天都可以 缺点&#xff1a;对环境要求较高&#xff0c;屋子里只能有自己&#xff0c;而且不能有其他声音…

yolov9 瑞芯微芯片rknn部署、地平线芯片Horizon部署、TensorRT部署

特别说明&#xff1a;参考官方开源的yolov9代码、瑞芯微官方文档、地平线的官方文档&#xff0c;如有侵权告知删&#xff0c;谢谢。 模型和完整仿真测试代码&#xff0c;放在github上参考链接 模型和代码。 之前写过yolov8检测、分割、关键点模型的部署的多篇博文&#xff0c;y…

软考中级 软件设计师备考经验

考试介绍 软考中级的软件设计师需要考两个部分&#xff0c;选择题和大题&#xff0c;每科满分75&#xff0c;需要在同一次考试中两科同时大于等于45分才算通过。考试的内容包括计算机组成原理、数据结构、数据库、专业英语、信息安全、计算机网络等&#xff0c;范围比较广但考…

Linux中systemv共享内存

目录 1.原理 2.接口 1.shmget(share_memory_get获得共享内存) 2.ftok 3.shmat(share_memory_attaintion挂接到物理内存上) 4.key和shmid的区别 5.ipc 指令 6.shmdt函数&#xff08;share_memory_detach取消挂接&#xff09; 7.shmctl函数&#xff08;share_memory_cont…

GenAI助力DevOps,塑造软件工程的未来

自 2022 年以来&#xff0c;GenAI 无疑已成为一种普遍的技术趋势。在本文中&#xff0c;我们将探索 DevOps 中令人兴奋的 GenAI 领域&#xff0c;讨论其潜在优势、局限性、新兴趋势和最佳实践&#xff0c;深入了解 AI 支持的 DevOps 前沿世界&#xff0c;并探索这一强大组合如何…

Laravel Octane 和 Swoole 协程的使用分析二

又仔细研究了下 Octane 源码和 Swoole 的文档&#xff0c;关于前几天 Laravel Octane 和 Swoole 协程的使用分析中的猜想&#xff0c;得到进一步验证&#xff1a; Swoole 的 HTTP Server 启动后会创建一个 master 进程和一个 manager 进程&#xff1b;master 进程又会创建多个…

智能咖啡厅助手:人形机器人 +融合大模型,行为驱动的智能咖啡厅机器人(机器人大模型与具身智能挑战赛)

智能咖啡厅助手&#xff1a;人形机器人 融合大模型&#xff0c;行为驱动的智能咖啡厅机器人(机器人大模型与具身智能挑战赛) “机器人大模型与具身智能挑战赛”的参赛作品。的目标是结合前沿的大模型技术和具身智能技术&#xff0c;开发能在模拟的咖啡厅场景中承担服务员角色并…

javaWebssh在线授课辅导系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh在线授课辅导系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.…