C++ map用法总结

2023-10-31

1,map简介

map是STL的一个关联容器,它提供一对一的hash。

  • 第一个可以称为关键字(key),每个关键字只能在map中出现一次;
  • 第二个可以称为该关键字的值(value);

map以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。Map主要用于资料一对一映射(one-to-one)的情況,map內部的实现自建一棵红黑树,这颗树具有对数据自动排序的功能。在map内部所有的数据都是有序的,后边我们会见识到有序的好处。比如一个班级中,每个学生的学号跟他的姓名就存在著一对一映射的关系。

 

2,map的功能

自动建立key - value的对应。key 和 value可以是任意你需要的类型。

 

3,使用map

使用map得包含map类所在的头文件

#include <map>  //注意,STL头文件没有扩展名.h

map对象是模板类,需要关键字和存储对象两个模板参数:

std:map<int, string> personnel;

这样就定义了一个用int作为索引,并拥有相关联的指向string的指针.

为了使用方便,可以对模板类进行一下类型定义,

typedef map<int,CString> UDT_MAP_INT_CSTRING;

UDT_MAP_INT_CSTRING enumMap;

 

4,map的构造函数

map共提供了6个构造函数,这块涉及到内存分配器这些东西,略过不表,在下面我们将接触到一些map的构造方法,这里要说下的就是,我们通常用如下方法构造一个map:

map<int, string> mapStudent;
 

5,插入元素

// 定义一个map对象
map<int, string> mapStudent;
 
// 第一种 用insert函數插入pair
mapStudent.insert(pair<int, string>(000, "student_zero"));
 
// 第二种 用insert函数插入value_type数据
mapStudent.insert(map<int, string>::value_type(001, "student_one"));
 
// 第三种 用"array"方式插入
mapStudent[123] = "student_first";
mapStudent[456] = "student_second";

以上三种用法,虽然都可以实现数据的插入,但是它们是有区别的,当然了第一种和第二种在效果上是完成一样的,用insert函数插入数据,在数据的 插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是不能在插入数据的,但是用数组方式就不同了,它可以覆盖以前该关键字对 应的值,用程序说明如下:

mapStudent.insert(map<int, string>::value_type (001, "student_one"));
 
mapStudent.insert(map<int, string>::value_type (001, "student_two"));

上面这两条语句执行后,map中001这个关键字对应的值是“student_one”,第二条语句并没有生效,那么这就涉及到我们怎么知道insert语句是否插入成功的问题了,可以用pair来获得是否插入成功,程序如下

// 构造定义,返回一个pair对象
pair<iterator,bool> insert (const value_type& val);
 
pair<map<int, string>::iterator, bool> Insert_Pair;
 
Insert_Pair = mapStudent.insert(map<int, string>::value_type (001, "student_one"));
 
if(!Insert_Pair.second)
    cout << ""Error insert new element" << endl;

我们通过pair的第二个变量来知道是否插入成功,它的第一个变量返回的是一个map的迭代器,如果插入成功的话Insert_Pair.second应该是true的,否则为false。

 

6, 查找元素

当所查找的关键key出现时,它返回数据所在对象的位置,如果沒有,返回iter与end函数的值相同。

// find 返回迭代器指向当前查找元素的位置否则返回map::end()位置
iter = mapStudent.find("123");
 
if(iter != mapStudent.end())
       cout<<"Find, the value is"<<iter->second<<endl;
else
   cout<<"Do not Find"<<endl;

7, 刪除与清空元素

//迭代器刪除
iter = mapStudent.find("123");
mapStudent.erase(iter);
 
//用关键字刪除
int n = mapStudent.erase("123"); //如果刪除了會返回1,否則返回0
 
//用迭代器范围刪除 : 把整个map清空
mapStudent.erase(mapStudent.begin(), mapStudent.end());
//等同于mapStudent.clear()

 

8,map的大小

在往map里面插入了数据,我们怎么知道当前已经插入了多少数据呢,可以用size函数,用法如下:

int nSize = mapStudent.size();

 9,map的基本操作函数:

   C++ maps是一种关联式容器,包含“关键字/值”对

  •      begin()         返回指向map头部的迭代器
  •      clear()        删除所有元素
  •      count()         返回指定元素出现的次数
  •      empty()         如果map为空则返回true
  •      end()           返回指向map末尾的迭代器
  •      equal_range()   返回特殊条目的迭代器对
  •      erase()         删除一个元素
  •      find()          查找一个元素
  •      get_allocator() 返回map的配置器
  •      insert()        插入元素
  •      key_comp()      返回比较元素key的函数
  •      lower_bound()   返回键值>=给定元素的第一个位置
  •      max_size()      返回可以容纳的最大元素个数
  •      rbegin()        返回一个指向map尾部的逆向迭代器
  •      rend()          返回一个指向map头部的逆向迭代器
  •      size()          返回map中元素的个数
  •      swap()           交换两个map
  •      upper_bound()    返回键值>给定元素的第一个位置
  •      value_comp()     返回比较元素value的函数
     

 

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

C++ map用法总结 的相关文章

随机推荐

  • VMware虚拟机桥接配置,访问局域网虚拟机

    目的 同一局域网 两台主机的虚拟机互通 背景 家里有两台电脑 一台台式 一台手提 想让他们的虚拟机可以直接通信而不是添加端口 以小米路由器为例 确认ip所在网段 机器信息 台式机 192 168 91 192 gt 虚拟机 192 168
  • CEP的设计模式--构建模块

    一 事件 EVENT 是由schema来定义的 是事件属性的元组 二 流 STREAM 事件流 time ordered sequence of event 是基于时间的事件序列 append only 不能移除事件 只能追加 unboun
  • vue3+ts项目打包后的本地访问

    注意 打包之后不可直接点击html访问 需要给项目安装本地服务 1 安装servenpm i g serve 2 打包项目npm run build 生成dist文件夹 3 本地访问serve dist 运行service dist之后的控
  • WebService 代码创建E9流程

    下载CXF http cxf apache org download html 生成客户端代码 tar zxvf apache cxf 3 2 7 tar gz cd apache cxf 3 2 7 bin wsdl2java clien
  • 定义类数组

    在java中 可以类为基本对象来定义一个数组 也就是直接以一个class作为一个类型 同时里面还有属性 编写学生类 包含姓名 学号 成绩三个属性 题目要求 1 为学生类添加构造函数给每个成员属性赋值 使用this关键字 2 为学生添加toS
  • Centos7部署轻量级自动化运维工具pssh (亲测)

    下载pssh安装包 root localhost wget https files pythonhosted org packages 60 9a 8035af3a7d3d1617ae2c7c174efa4f154e5bf9c24b36b6
  • js中数组的sort()方法及原理

    定义与用法 sort 方法用于对数组的元素进行排序 语法 arrayObject sort sortby 注意 sortby必须是函数 规定排序顺序 可选参数 返回值 对数组的引用 请注意 数组在原数组上进行排序 不生成副本 说明及原理 如
  • matlab打开出现桌面错误,手把手为您win10系统笔记本运行Matlab软件弹出已停止工作错误窗...

    今天小编分享一下win10系统笔记本运行Matlab软件弹出已停止工作错误窗口问题的处理方法 在操作win10电脑的过程中常常不知道怎么去解决win10系统笔记本运行Matlab软件弹出已停止工作错误窗口的问题 有什么好的方法去处理win1
  • C++ string类

    目录 1 为什么要学习string类 1 1 C语言中的字符串 1 2 两个面试题 暂不做讲解 2 标准库中的string类 2 1 string类 了解 2 2 string类的常用接口说明 注意下面我只讲解最常用的接口 1 string
  • webstorm+小程序相配合来开发小程序

    前言 webstorm可以安装的一个小程序插件 wechat miniprogram plugin 来实现小程序语法的高亮 并识别 rpx 这种小程序专有单位 还可以实现跟开发者工具中一些类似的操作功能 注意事项 1 小程序的根目录下的pr
  • 类对象数组初始化(三种方法)

    参考自 More Effective C 中文版 类对象数组初始化参考自 More Effective C 中文版 类对象数组初始化 如有一个如下类 class EquipmentPiece private int IDNumber pub
  • Python中tkinter库的menu的使用(制作菜单栏)

    import tkinter as tk wd tk Tk wd title 11 wd geometry 300x300 l tk Label wd text bg yellow pack 先载入对象 类似父类 嵌套对象 menubar
  • Nginx四层代理和七层代理的区别

    4层是指传输层的TCP UDP协议 7层是指应用层的HTTP协议 代理原理 4层代理 使用NAT Network Address Translation 技术 即网络地址转换 即请求进来的时候 nginx只修改数据包里面的目标IP 源IP
  • 浅谈密码破译

    关于密码破译 今天见到一篇文章 读来心中甚是激动 特记录在案 目录 密码破译 1 两种方式 2 双重验证系统2FA 3 密码登录的常见方式 3 1 基于 存储密码 的密码登录步骤 3 2 基于 密码散列 的密码登录步骤 4 暴力破解散列 密
  • 【NLP傻瓜式教程】手把手带你CNN文本分类(附代码)

    文章来源于NewBeeNLP 作者kaiyuan 写在前面 本文是对经典论文 Convolutional Neural Networks for Sentence Classification 1 的详细复现 应该是 基于TensorFlo
  • 200与mcgs485实例 smart_西门子Smart触摸屏与S7-200Smart无线PPI通讯实例

    在工业现场往往会用触摸屏来控制现场的PLC工作 若是遇到布线不方便或是工期较短的情况 那么可以采用无线数据交换的方式来完成触摸屏对PLC的RS485无线通讯 1 自由串口协议 2 Modbus协议 3 PPI协议 以下为大家介绍一种使用PP
  • 小结:token放在header中好处,HTTP Header详解(OAuth JWT等)

    1 Token机制相对于Cookie机制又有什么好处及基于JWT的Token认证机制实现 支持跨域访问 Cookie是不允许垮域访问的 这一点对Token机制是不存在的 前提是传输的用户认证信息通过HTTP头传输 引自 http www c
  • git status显示修改了大量文件

    diff git a Android mk b Android mk old mode 100644 new mode 100755 原来是filemode的变化 文件chmod后其文件某些位是改变了的 如果严格的比较原文件和chmod后的
  • Scratch编程入门-画图模块1【认识画图模块积木】

    在少儿编程软件Scratch中 拥有许多的拓展模块 在这些拓展模块里面 画笔模块 无疑是使用最多的模块之一 无论是中国电子学会的图形化编程考级题目还是线上线下的少儿编程比赛以及蓝桥杯甚至白名单的比赛题目中 使用该模块的画图类编程题目都是最重
  • C++ map用法总结

    1 map简介 map是STL的一个关联容器 它提供一对一的hash 第一个可以称为关键字 key 每个关键字只能在map中出现一次 第二个可以称为该关键字的值 value map以模板 泛型 方式实现 可以存储任意类型的数据 包括使用者自