map容器(重要)

news2025/3/9 22:21:20

1、map容器简介

Map容器中所有的元素都会根据元素的键值自动实现排序。Map中所有的元素都是pair,pair的简介
同时拥有实值和键值,而前面的 set 只是拥有 键值,pair 中的 第一个元素是键值,而第二个值是 实值。Map 中是不允许有两个相同的键值的,就像一个学校中一样,学生的学号就是键值,而学号对应的学生的具体信息就是实值。而且,我们不能通过Map 的迭代器改变map的键值,因为map 的键值关系到 map 元素的排列规则,任意改变map 的键值将会严重破坏 map 的组织。但是修改键值所对应的实值是可以的,Map 和 list 拥有相同的某些性质,当对它容器中的元素进行插入或者删除的时候,操作之前的所有迭代器,在操作完成之后依然是有效的,当然那个被删除元素的迭代器必然是一个例外。Multilmap 和 map 的操作类似,唯一的区别是 multimap 的键值是可以重复的,Map 和 multimap 的底层都是以 红黑树为实现机制的
Map的键值是不能修改的,因为它是根据键值来实现排序的

2、Map 容器 API 操作

建立 Person 类

#include <iostream>
#include <map>
using namespace std;
class Person
{
    friend void test01();
    friend void printMapAll(map<int, Person> &m);
private:
    int num;
    string name;
    float score;
public:
    Person(){}
    Person(int num,string name, float score);
};

Person::Person(int num, string name, float score)
{
    this->num = num;
    this->name = name;
    this->score = score;
}

打印学生信息

void printMapAll(map<int, Person> &m)
{
    map<int, Person>::const_iterator it;
    for(it=m.begin(); it!=m.end();it++)
    {
        //(*it) ==pair<int, Person>
        cout<<"学号:"<<(*it).first<<" 姓名:"<<(*it).second.name<<" \
分数:"<<(*it).second.score<<endl;
    }
}

test01函数实现 Map 对应的 API 操作

void test01()
{
    //Map和set一样唯一的插入方式,不能同时插入 n 个一样的构造函数,因为键值不能重复,所以只能用这种方式插入 
    map<int, Person> m;
    //方式1:
    m.insert(pair<int,Person>(103, Person(103,"lucy", 88.8f)));
    //方式2:推荐
    m.insert(make_pair(101,Person(101,"bob", 77.7f)));
    //方式3:
    m.insert( map<int, Person>::value_type( 102 , Person(102,"tom", 66.6f)));
    //方式4:
    m[104] = Person(104,"德玛", 99.9f);

    printMapAll(m);

    //假如key值存在  m[key]代表对应的实值,但是最好不要这么访问操作,因为要是 键值 107 不存在,就会添加一个学生信心,所以不推荐使用这种方式访问 
    cout<< m[107].num<<" "<<m[107].name<<" "<<m[107].score<<endl;

    cout<<"----------使用m[107].num产生问题------------"<<endl;
    printMapAll(m);

    m.erase(104);       //可以删除迭代器,也可以删除元素 
    cout<<"----------"<<endl;
    printMapAll(m);

    //查找key为103的数据
    map<int, Person>::const_iterator ret;
    ret = m.find(103);      //find的返回值是当前容器Map的迭代器 
    if(ret != m.end())
    {
        //*ret == pair<int,Person>
        cout<<(*ret).first<<" "<<(*ret).second.name<<" "<<(*ret).second.score<<endl;
    }
}

主函数调用 test01


int main(int argc, char *argv[])
{
    test01();
    return 0;
}

——————————————————————————————————————————————
所有代码如下
#include
#include
using namespace std;
class Person
{
friend void test01();
friend void printMapAll(map<int, Person> &m);
private:
int num;
string name;
float score;
public:
Person(){}
Person(int num,string name, float score);
};

Person::Person(int num, string name, float score)
{
this->num = num;
this->name = name;
this->score = score;
}

void printMapAll(map<int, Person> &m)
{
map<int, Person>::const_iterator it;
for(it=m.begin(); it!=m.end();it++)
{
//(*it) ==pair<int, Person>
cout<<“学号:”<<(*it).first<<" 姓名:“<<(*it).second.name<<”
分数:"<<(*it).second.score<<endl;
}
}

void test01()
{
//Map和set一样唯一的插入方式,不能同时插入 n 个一样的构造函数,因为键值不能重复,所以只能用这种方式插入
map<int, Person> m;
//方式1:
m.insert(pair<int,Person>(103, Person(103,“lucy”, 88.8f)));
//方式2:推荐
m.insert(make_pair(101,Person(101,“bob”, 77.7f)));
//方式3:
m.insert( map<int, Person>::value_type( 102 , Person(102,“tom”, 66.6f)));
//方式4:
m[104] = Person(104,“德玛”, 99.9f);

printMapAll(m);

//假如key值存在 m[key]代表对应的实值,但是最好不要这么访问操作,因为要是 键值 107 不存在,就会添加一个学生信心,所以不推荐使用这种方式访问
cout<< m[107].num<<" “<<m[107].name<<” "<<m[107].score<<endl;

cout<<“----------使用m[107].num产生问题------------”<<endl;
printMapAll(m);

m.erase(104); //可以删除迭代器,也可以删除元素
cout<<“----------”<<endl;
printMapAll(m);

//查找key为103的数据
map<int, Person>::const_iterator ret;
ret = m.find(103); //find的返回值是当前容器Map的迭代器
if(ret != m.end())
{
//*ret == pair<int,Person>
cout<<(*ret).first<<" “<<(*ret).second.name<<” "<<(*ret).second.score<<endl;
}
}

int main(int argc, char *argv[])
{
test01();
return 0;
}
——————————————————————————————————————————————
在这里插入图片描述

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

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

相关文章

Maven的进阶操作

系列文章目录 Maven进阶操作的学习 文章目录系列文章目录前言一、分模块开发与设计二、依赖管理1.依赖传递2.可选依赖3.排除依赖三、继承与聚合1.聚合2.继承四、属性1.属性2.版本管理五、多环境配置与应用1.多环境开发2.跳过测试六、私服1.私服简介2.私服仓库分类3.资源上传与…

IDEA的基本使用

IDEA的基本使用IDEA的基本使用1 IDEA概述2 IDEA的下载和安装2.1 下载2.2 安装3 IDEA中层级结构介绍3.1 结构分类3.2 结构介绍project&#xff08;项目、工程&#xff09;module&#xff08;模块&#xff09;package&#xff08;包&#xff09;class&#xff08;类&#xff09;3…

C#基础学习--委托

委托 什么是委托 可以认为委托是持有一个或多个方法的对象。 委托和类一样&#xff0c;是一种用户自定义的类型。但类表示的是数据和方法的集合&#xff0c;而委托则持有一个或多个方法&#xff0c;以及一系列预定操作。 可以通过一下擦欧总来使用委托&#xff1a; 可以把d…

度量,我们如何以终为始,以始为终?

你好&#xff0c;我是黄俊彬。 很多时候在研发过程中&#xff0c;我们都习惯性地用“拍脑袋”的方式来看待一个事情。例如这个代码写得不好、这个自动化测试覆盖不充分、版本的发布频率太差了等等。往往只知道哪里有问题&#xff0c;但是却不知如何去找出根因&#xff0c;真正…

14、MyBatis-Plus入门到进阶

1、Mybatis的问题 【简介】&#xff1a; 每个实体类对应一个实体类,对应一个mapper接口,对应一个mapper.xml文件,每个mapper接口都有重复的crud方法,每一个mapper.xml都有重复的crud的sql配置。 2、Mybatis-plus简介 1、官网 Mybatis-plusMybatis-plus 2、MyBatis是什么&a…

JS常用字符串方法

&#x1f4dd;个人主页&#xff1a;爱吃炫迈 &#x1f48c;系列专栏&#xff1a;数据结构与算法 &#x1f9d1;‍&#x1f4bb;座右铭&#xff1a;道阻且长&#xff0c;行则将至&#x1f497; 文章目录移除字符串首尾空白符trim()trimStart()trimEnd()获取字符串指定位置的值ch…

记2023第十四届蓝桥杯感受

弱校ACM队员&#xff0c;曾获CB国二&#xff0c;CG国优第六。&#xff08;我是fw&#xff09; ------------------------------------------------------------------------分割线 2023.04.09 今年再次参加CG组&#xff0c;估计g了&#xff0c;盲猜一波省二前排&#xff0c;出…

基于BenchmarkSQL的Oracle数据库tpcc性能测试

基于BenchmarkSQL的Oracle数据库tpcc性能测试安装BenchmarkSQL及其依赖安装软件依赖编译BenchmarkSQLBenchmarkSQL props文件配置数据库用户配置BenchmarkSQL压测装载测试数据TPC-C压测&#xff08;固定事务数量&#xff09;TPC-C压测&#xff08;固定时长&#xff09;生成测试…

C++轻量级Web服务器TinyWebServer源码分析之http篇

文章目录http篇简介一、服务器接收http请求和http报文解析解析报文整体流程从状态机逻辑主状态机逻辑二、服务器响应请求报文http篇简介 http类这篇个人觉得是最难同时也是最繁琐的一篇&#xff0c;本篇在基础知识方面&#xff0c;包括epoll、HTTP报文格式、状态码和有限状态机…

Python 小型项目大全 71~75

七十一、声音模拟 原文&#xff1a;http://inventwithpython.com/bigbookpython/project71.html 类似于西蒙电子玩具&#xff0c;这款识记游戏使用第三方playsound模块&#xff0c;播放四种不同的声音&#xff0c;分别对应键盘上的A、S、D、F键。当你成功地重复游戏给你的图案时…

驱动保护 -- 通过PID保护指定进程

一、设计界面 1、添加一个编辑框输入要保护的进程PID&#xff0c;并添加两个按钮&#xff0c;一个保护进程&#xff0c;一个解除保护 2、右击编辑框&#xff0c;添加变量 二、驱动层代码实现 1、声明一个受保护的进程PID数组 static UINT32 受保护的进程PID[256] { 0 }; 2…

Python Web开发技巧II

Postman安置Cookie 对于大型项目而已&#xff0c;所携带的cookie往往都不止一个&#xff0c;而是一堆&#xff0c;甚至特别特别长&#xff0c;postman文档提供的cookie操作是全局的&#xff0c;但需要一个一个打&#xff08;折磨&#xff09;&#xff0c;唯一的优点就是作用域…

tocbot生成文章目录

学习链接 github上的tocbot npmjs上的tocbot 效果图 使用步骤 1. 安装tocbot npm install tocbot --save2. vue组件中使用引入tocbot 只需要引入tocbot&#xff0c;然后调用tocbot.init(…)&#xff0c;指定提取的文章内容所在的dom&#xff0c;以及要把生成的目录放到哪个…

4月第1周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!

飞瓜轻数发布2023年4月3日-4月9日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B站…

Flink (十一) --------- Table API 和 SQL

目录一、快速上手1. 需要引入的依赖2. 一个简单示例二、基本 API1. 程序架构2. 创建表环境3. 创建表4. 表的查询5. 输出表6. 表和流的转换三、流处理中的表1. 动态表和持续查询2. 将流转换成动态表3. 用 SQL 持续查询3. 将动态表转换为流四、时间属性和窗口1. 事件时间2. 处理时…

PDF怎么转换成word格式?这三个方法转换效率很高

在日常办公生活中&#xff0c;我们经常需要对文件进行格式转换&#xff0c;尤其是将PDF文件转换为可编辑的Word文件。虽然在Office软件中将Word文件转换为PDF很容易&#xff0c;但是将PDF文件转换为Word文件却需要一些技巧。在保证安全性能的前提下&#xff0c;如何将PDF文件转…

回溯算法编程题集合(leetcode)

给定一个整数数组 nums 和一个正整数 k&#xff0c;找出是否有可能把这个数组分成 k 个非空子集&#xff0c;其总和都相等。 示例 1&#xff1a; 输入&#xff1a; nums [4, 3, 2, 3, 5, 2, 1], k 4 输出&#xff1a; True 说明&#xff1a; 有可能将其分成 4 个子集&#x…

【springboot】ApplicationListener用法及源码

用法 方法一&#xff1a;继承ApplicationListener 传递事件 继承于ApplicationEvent public class ForDebuggerEvent extends ApplicationEvent {public ForDebuggerEvent(Object source) {super(source);}public void executeEvent() {System.out.println("ForDebugge…

第四章 网络层

网络层服务 网络层需要实现的两项重要功能&#xff1a; 转发&#xff1b;当通过一条输入链路接收到一个分组后&#xff0c;路由器需要决策通过哪条输出链路将分组发送出去&#xff0c;并将分组从输入接口转移到输出接口路由选择&#xff1b;当分组从源主机流向目的主机时&…

24.SSM-SpringMVC延续--拦截器

目录 一、拦截器。 &#xff08;1&#xff09;拦截器的作用。 &#xff08;2&#xff09;拦截器与过滤器的区别。 &#xff08;3&#xff09;拦截器的方法。 &#xff08;4&#xff09;拦截器的快速入门。 &#xff08;5&#xff09;多拦截器。 &#xff08;5.1&#xf…