C++中map用法

2023-05-16

一、头文件

#include<map>

map是一种以键--值(key-value)存储的数据类型

map中的数据默认按照key的值从小到大排序,value若为Int类型,默认为0

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

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

二,定义

构造函数原型:

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

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

示例如下:

1)map<int,string> m;//定义了一个空的对象m

2)map<string,vector<string>> m;//

3)map<int,int> m;
map<int,int> m2=m;

三、常用操作


1)插入元素

常用的插入方式是m[key]=value;

如果是map<int,vector<int>> m;

可以使用m[key]={0,1,2};//这种方式

示例如下:

   map<int,int> m1;
   m1.insert({1,10});
   m1.insert({2,20});
   m1.insert({3,30});
   m1.insert({4,40});

   m1[5]=50;
   m1[6]=60;

2)删除

erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(begin,end);//删除区间[begin,end)的元素,返回下一个元素的迭代器
erase(key);//删除容器中值为key的元素
clear();//删除所有元素

示例如下:

   map<int,int> m1;
   m1.insert({1,10});
   m1.insert({2,20});
   m1.insert({3,30});
   m1.insert({4,40});

   m1[5]=50;
   m1[6]=60;

   m1.erase(m1.begin());//0,20,30,40,50,60

   auto it=m1.find(3);
   m1.erase(m1.begin(),it);//0,0,30,40,50,60

   m1.clear();//删除所有元素

3)查找和统计

find(val);//查找val是否存在,若存在,返回该键的迭代器,不存在,返回m.end();
count(val);//统计val的个数
 map<int,int> m1;
   m1.insert({1,10});
   m1.insert({2,20});
   m1.insert({3,30});
   m1.insert({4,40});
   m1[5]=50;
   m1[6]=60;
   
   auto it=m1.find(3);
   cout<<it->first<<" "<<it->second<<endl;//3,20

   cout<<m1.count(3)<<endl;//1

4)遍历

设map<int,int> m

则遍历如下:

map<int,int>::iterator iter=m.begin();
while(iter!=m.end())
{
cout<<iter->first<<" "<<iter->second<<endl;//输出
iter++;
}

使用auto遍历

for(auto iter=m.begin();iter!=m.end();iter++)
{
    cout<<iter->first<<" "<<iter->second<<endl;
}

for(auto &v:m)
{
    cout<<v->first<<v.second<<endl;
}

map<int,vector<int>> m;

使用auto遍历

for(auto &[_,v]:m)
  {
    cout<<v[0]<<endl;
    cout<<v[1]<<endl;
    //可以对vector进行操作
  }

5)大小与交换

size();//返回容器中的元素数目
empty();//判断容器是否为空
swap(m2);//交换2个容器的元素

示例如下:

map<int,int> m1;
   m1.insert({1,10});
   m1.insert({2,20});
   m1.insert({3,30});
   m1.insert({4,40});

   cout<<m1.size()<<endl;//4
   cout<<m1.empty()<<endl;//0

   map<int,int> m2;
   m2.insert({6,10});
   m2.insert({7,30});
   m2.swap(m1);

6)排序

map默认按照key值从小到大排序,可以利用仿函数改变排序规则

第一种方式:使用仿函数

示例1:使用内置数据类型

class compare
{
public:
   bool operator()(int v1,int v2)
   {
      return v1>v2;
   }
};

map<int,int,compare> m1;
m1.insert({1,10});
m1.insert({2,20});
m1.insert({3,30});

for(auto it=m1.begin();it!=m.end();it++)
   cout<<it->first<<" "<<it->second<<endl;

//输出3,30   2,20   1, 10

示例2:使用自定义数据类型

class student{

public:
    int age;
    string name;
    student(int ag,string nam)
    {
        age=ag;
        name=nam;
    }
};

class compare
{
public:
    bool operator()(const student& s1,const student& s2) const
    {
        return s1.age>s2.age;
    }
};

int main()
{
   map<student,char,compare> m1;
   student t1(1,"h1");
   student t2(2,"h2");
   student t3(3,"h3");
   m1[t1]='a';
   m1.insert({t2,'b'});
   m1.insert({t3,'c'});

   for(auto it=m1.begin();it!=m1.end();it++)
       cout<<it->first.age<<" "<<it->first.name<<" "<<it->second<<endl;

    return 0;
}

输出为:

3 h3 c
2 h2 b
1 h1 a

注意:自定义排序规则时,无论是传递参数,还是整个函数的const都必须写上

第二种方式:重载operator<()操作符

直接在定义类中重载operator<()操作符。

示例如下:

class student{

public:
    int age;
    string name;
    student(int age,string name)
    {
        this->age=age;
        this->name=name;
    }

    bool operator<(const student &s) const
    {
        return age>s.age;
    }
};

int main()
{
   map<student,char> m1;
   student t1(1,"h1");
   student t2(2,"h2");
   student t3(3,"h3");
   m1[t1]='a';
   m1.insert({t2,'b'});
   m1.insert({t3,'c'});

   for(auto it=m1.begin();it!=m1.end();it++)
       cout<<it->first.age<<" "<<it->first.name<<" "<<it->second<<endl;

    return 0;
}

输出为:

3 h3 c
2 h2 b
1 h1 a

自定义排序规则还有几种方式,可以额外了解一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中map用法 的相关文章

  • unordered_map详解

    p include stdafx h include p
  • echarts地图map

    在vue中使用echarts绘制图表 npm install echarts save 全局安装echarts 具体代码及注释如下
  • 自行获取区域经纬度的工具

    摘要 上一章教大家如何建立自己的行政区域地图 这次为大家提供一个 可视化选择区域 并且能自动生成经纬度代码的工具 工具的源代码完全公开 并且做了详尽的注释 可以单纯做为一个工具 也可做为百度地图API的学习案例 工具说明 1 开关可以控制
  • map和set的概念及使用

    1 什么是关联式容器 关联式容器也是用来存储数据的 与序列式容器不同的是 其里面存储的是
  • vue+高德离线地图vue-amap开发

    前言 在使用多次高德离线地图的插件 vue amap 感觉收获还是很多的 这里来整理下相关资料 效果图 目录 实现步骤 源码在最下面 一 安装插件 二 template配置基础的地图组件 三 data里面定义相关数据 四 撒点的实现 1 t
  • 蓝桥杯:外卖店优先级(map排序算法) Java

    分析 发现只是输入两种数据 则可以考虑用map 经过分析发现 可以用店家编号来表示map的第一个参数Integer 第二个参数因为有可能有多个相同的时刻 所以用arraylist
  • Java常用对象API——Map集合

    java util 接口 Map
  • C++ 中 map 容器的内存释放机制及内存碎片管理

    C 中 map 容器的内存释放机制及内存碎片管理 C 中的容器很好用 比如 vector map 等 可以动态扩容 自己管理内存 不用用户关心 但是在某些极端情况下 如果内存比较紧张的情况下 可能用户对于这些容器自己的管理规则 主要是释放规
  • 蓝桥杯VIP算法训练-轨道炮-看完秒懂的(c++map)

    题目描述 小明在玩一款战争游戏 地图上一共有 N 个敌方单位 可以看作 2D 平面上的点 其中第 i 个单位在 0 时刻的位置是 Xi Yi 方向是 Di 上下左右之一 用 U D L R 表示 速度是 Vi 小明的武器是轨道炮 只能使用一
  • mybatis中使用map批量更新

    最近项目中会用到批量更新功能 数据是存在map中的 key作为更新的id 而value作为更新的值 纠结了很久最后算是解决了 特此记录 希望对有需要的有一定帮助
  • 7-52 两个有序链表序列的交集 (20 分)(思路加详解尾插法)come Boby!

    一 题目 已知两个非降序链表序列S1与S2 设计函数构造出S1与S2的交集新链表S3 输入格式 输入分两行 分别在每行给出由若干个正整数构成的非降序序列 用 1表示序列的结尾 1不属于这个序列 数字用空格间隔 输出格式 在一行中输出两个输入
  • 深入浅出C++ ——map类深度剖析

    文章目录 一 map类介绍 二 map的使用 三 multimap 一 map类介绍 map是 C STL 中提供的容器 map是数学上的映射 其具有唯一性 即每个pair key value 只出现一次 而 multimap 则是可重复映
  • 每日一题:简单分数统计

    简单分数统计 题目 Daimayuan Online Judge 发现样例输出的是id和成绩 那么就写一个包含这两个变量的结构体来储存它们 另外 再写一个结构体来储存题目名称和分数 目的是使两者联系起来 找到题目名称就能知道对应的分数 AC
  • LinkedHashMap常用方法源码

    类介绍 注释 add contains remove 方法 时间复杂度是O 1 LinkedHashMap的遍历耗时 与 capacity无关 与map的size 元素多少 呈线性 HashMap的遍历 可能比 LinkedHashMap更
  • vue高德地图marker批量标记与InfoWindow提示框

    一 前言 由于数据量大 如果一个一个添加marker会造成页面卡顿 所以在此就使用了批量标记 特此研究出一下几种方法 在高德平台获取key 高德开放平台 高德地图API 二 批量添加marker标记 1 海量点标记 MassMarks 优点
  • 微信小程序开发——map地图组件,定位,并手动修改位置偏差。

    环境搭建 注册 获取APPID 没有这个不能真鸡调试 下载微信web开发者工具 挺多bug 将就用 打开微信web开发者工具 扫码登录 新建小程序 输入APPID 勾选创建quick start项目 工程结构 可以看到工程根目录中有个app
  • 【数据结构】Map 映射

    数据结构源码 接口 public interface Map
  • 使用cesium给地图实例添加精灵图图标

    前置条件 1 将精灵图存放在本地文件中 2 拿到对应的声明文件 该文件中存放了每一个类型的地图实例对应的图标在精灵图中的位置 我这里是json文件 这是某一个实例模型对应的数据 我的做法是 系统登录之后 就掉接口获取到该json文件 并存储
  • Golang Map原理(底层结构、查找/新增/删除、扩缩容)

    参考 解剖Go语言map底层实现 Go语言核心手册 3 字典 一 Go Map底层结构 Go map的底层实现是一个哈希表 数组 链表 使用拉链法消除哈希冲突 因此实现map的过程实际上就是实现哈希表的过程 先来看下go map底层的具体结
  • Dart中常用的集合类型List、Set、Map、Queue

    Dart中常用的集合类型 List 列表 有序集合 可以修改数据 Dart中List对应数组 可以通过索引访问元素 Set 集合 无序 不可重复 常用于过滤重复数据 Map 映射 键值对集合 键必须唯一 值可以重复 常用于存储关联数据 Qu

随机推荐

  • web开发中实现页面记忆的几种方式

    一 前言 在前段时间公司有个需求是对前一个页面的操作进行记忆 xff0c 例如分页的样式 xff0c 选中的条件等 之前是用的session去存储记忆数据 xff0c 老大让我调研一下目前比较合理的方式然后分析一下 xff0c 这里以本篇博
  • 基于VINS与FastPlanner的无人机自主飞行Gazebo仿真

    项目来源及展示 xff1a https www bilibili com video BV1WK4y1V7um from 61 search amp seid 61 12548150687335659873 基本思路 xff1a 采用Gaz
  • RGB-D SLAM 相关总结

    目录 一 RGB D SLAM是什么 xff1f 二 D435i说明 三 RGB D SLAM研究现状 1 现有的RGB D SLAM方法 1 1 前端 1 2 后端 1 3 闭环检测 1 4 制图 2 优秀RGB D SLAM介绍 2 1
  • VINS-Mono学习(一)——数据预处理

    void push back double dt const Eigen Vector3d amp acc const Eigen Vector3d amp gyr dt buf push back dt acc buf push back
  • VINS-Mono学习(四)——回环检测与重定位

    目录 1 闭环检测常用方法有哪些 xff1f 2 ORB SLAM2中Loop Closing的具体实现流程是怎样的 xff1f 3 VINS回环检测与重定位 四自由度位姿图优化 3 1 第一部分 xff1a 回环检测与重定位 3 1 1
  • LADRC的学习——总概

    作者 xff1a 墨心 日期 xff1a 2019 7 25 xff1b 学习LADRC结构 xff1a 1 学习PID的相关知识 xff0c 作为学习ADRC的基础铺垫 xff0c 在simulink中搭建模块 xff0c 通过调节参数
  • LADRC的学习——PID的学习

    PID部分的学习 上文介绍了ADRC的理论 xff0c 并试着按照自己的理解用Matab编程实现韩老师论文中的算法 xff0c 但是对调节参数和一些地方还不太懂 xff0c 因此我打算从头开始理解 xff0c 从PID的好坏开始学习理解 x
  • LADRC的学习——换被控对象进行仿真测试

    LADRC控制器的检验 用不同的被控对象测验 一 前文总结 这篇文章主要根据清华大学的硕士陈星写的论文 xff1a 自抗扰控制器参数整定方法及其热工过程中的应用 进行学习 参考文献为 xff1a 1 Zhiqiang Gao Scaling
  • ROS-3DSLAM(二)lvi-sam项目认识

    2021SC 64 SDUSC xff08 二 xff09 lvi sam项目认识 一 SLAM简介 SLAM是Simultaneous Localization and Mapping xff08 同时定位 43 建图 xff09 独立的
  • KMP算法——字符串匹配问题

    贴上原址 xff1a http www ruanyifeng com blog 2013 05 Knuth E2 80 93Morris E2 80 93Pratt algorithm html 感觉这篇文章讲得很不错 xff0c 很容易懂
  • ROS-3DSLAM(十六)lvi-sam项目总结

    2021SC 64 SDUSC 学习内容概览 本次的项目lvi sam主要分为两个大的模块 xff1a lidar模块和visual模块 我们小组学习先进行了lidar模块的学习 xff0c 然后进行的visual模块 每个模块都分成了若干
  • 项目实训 - 智能车系统 - 第八周记录

    项目实训 智能车系统 第八周记录 日期 xff1a 4 11 4 17 项目进度 本周工作进展 xff1a 完成了雷达驱动的编写 xff08 未测试 xff09 完成imu驱动的编写 xff08 未测试 xff09 与可视化部分进行对接 1
  • IIC详细解答+ 面试 + 代码

    目录 IIC背景提炼部分 xff08 面试 xff09 xff08 详解 43 代码 xff09 协议部分IIC部分初始化 IIC 的 IO 口IIC 开始信号IIC发送一个字节IIC 读一个字节响应ACK和非响应NACKIIC 停止信号
  • FreeRTOS内核学习高级篇-调度器使用

    学习资料链接 http wiki csie ncku edu tw embedded freertos https freertos blog csdn net article details 51190095 介绍 调度器是FreeRTO
  • ArduPilot日志系统探索(一)

    先把官方网站上日志相关的说明翻译下来 xff1a ArduPilot Documentation ArduPilot documentation 页面 xff1a Logs Copter documentation 与日志记录和分析相关的主
  • 暗影精灵4 安装双系统方法:win10 + ubuntu16.04 LTS

    准备工作 1 重要 xff1a 备份文件 xff0c 安装双系统有成功的 xff0c 也有失败的 xff0c 做好备份工作更保险 xff01 2 需要一个制作启动盘的U盘 gt 61 8G xff0c UltralSO刻录软件 xff0c
  • [现代控制理论]9_状态观测器设计_龙伯格观测器

    现代控制理论 11 现代控制理论串讲 完结 pdf获取 现代控制理论 10 可观测性与分离原理 观测器与控制器 现代控制理论 9 状态观测器设计 龙伯格观测器 现代控制理论 8 5 线性控制器设计 轨迹跟踪simulink 现代控制理论 8
  • [非线性控制理论]9_非线性控制理论串讲

    非线性控制理论 1 Lyapunov直接方法 非线性控制理论 2 不变性原理 非线性控制理论 3 基础反馈稳定控制器设计 非线性控制理论 4 反馈线性化 反步法 非线性控制理论 5 自适应控制器 Adaptive controller 非线
  • ubuntu16.04安装realsenseD435i sdk

    此处安装的intel realsense sdk2 0 xff0c 官方安装 xff0c 若从源码自行编译 xff0c 不可参考本教程 github原网址https github com IntelRealSense librealsens
  • C++中map用法

    一 头文件 include lt map gt map是一种以键 值 key value 存储的数据类型 map中的数据默认按照key的值从小到大排序 value若为Int类型 xff0c 默认为0 map不允许容器中有重复key值元素 m