当前位置: 首页 > news >正文

map与multimap

目录

map

map的介绍

map的使用

map的模版参数

map的构造

map的迭代器

map的容量

map中元素的修改

map中的查找

map的元素访问

multimap


map

map的介绍

  1. map是关联式容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素
  2. 在map中,键值key通常用于排序和唯一的标识元素,而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同,且在map内部,key和value通过成员类型value_type绑定在一起, 为其取名为pair:typedef pair<const key,value> value_type
  3. 在map中,元素总是根据key值进行比较排序
  4. map中通过key访问单个元素的速度通常比unordered_map容器要慢,但map允许根据顺序对元素进行直接迭代
  5. map支持下标访问符,即在[]中放入key,就可以找到与其相对应的value
  6. map的底层是二叉搜索数

map的使用

map的模版参数

map的构造

map的迭代器

map的容量

map中元素的修改

insert:

        这里我们重点看(1),首先(1)插入的元素看似是一个值,但它却是一个类类型,因为value_type是它的重命名,其真正的类型是pair<const key_type,mapped_type>,因此我们想要插入一个元素就要将其转化为pair类型

        其次(1)的返回值,我们可以看到该返回值是一个类,且该类将两个不同类型的变量组合成了一个单元,在这里第一个变量存储了插入元素的迭代器,第二个变量存储的是一个bool值。如果插入成功,那么迭代器指向插入的那个元素,且bool值为true;如果插入失败(map中存在该值),则迭代器指向与插入值相等的那个元素的位置,bool值为false。

        在这里我们可以看一下pair的模版参数:

        里面有两个成员变量分别命名为first和second,如图:

        其构造函数如图:

        代码如下:

void test_pair()
{pair<string, int> s1;pair<string, int> s2("苹果", 1);pair<string, int> s3(s2);s1 = make_pair("香蕉", 2);cout << s1.first << ":" << s1.second << endl;cout << s2.first << ":" << s2.second << endl;cout << s3.first << ":" << s3.second << endl;
}

        运行结果如图:

        从上面我们可以看到pair的构造有两种,第一种是直接构造,第二中是通过make_pair函数进行构造

make_pair函数的模版参数如下:

        其作用是构造一个pair对象,其第一个元素设置为x,第二个元素设为y,分别对应pair的first和second

        因此,map中插入一个元素的代码如下所示:

void test_map1()
{map<string, int> mst;mst.insert(pair<string, int>("苹果", 1));mst.insert(make_pair("香蕉", 2));mst.insert(make_pair("橙子", 3));mst.insert(make_pair("橘子", 4));for (auto& mit : mst){cout << mit.first << ":" << mit.second << endl;}
}

        注:insert的返回值是一个pair,因此要用pair接收

erase

        

        (1)删除迭代器位置上的元素

        (2)删除等于k的元素,并返回删除的个数

        (3)删除一段迭代器区间

map中的查找

        我们可以看到find的参数类型是key_type,这说明map的查找是通过key进行的,与value无关

map的元素访问

        我们可以看到该函数的参数为key,返回值是value的引用,因此我们可以通过该函数对value修改

        C++库中,调用该函数相当于调用了下面这段代码:

(*((this->insert(make_pair(k,mapped_type()))).first)).second

        对上面这段代码进行解释,首先调用这段语句通过make_pair函数创建了一个pair对象,其中first是要插k,second则是根据默认构造函数创建的值;其次调用这段语句在这个map中插入该pair对象,并返回一个pair对象,该pair对象中存储的是该元素位置的迭代器和一个bool值;最后就是对该插入元素位置的迭代器解引用,解引用得到插入的那个pair对象,并取这个pair对象的second进行返回,由于返回是引用返回,因此可以通过该函数对value进行修改

void test_map2()
{map<string, int> mst;string s[] = {"香蕉","苹果","橘子","橙子","香蕉" ,"香蕉" ,"橘子" ,"椰子"};for (auto& sit : s){mst[sit]++;//首先从map里面找与sit相同的元素,如果没有就插入该元素并初始化value,如果有就找到该元素并对该元素的value值++}for (auto& mit : mst){cout << mit.first << ":" << mit.second << endl;}
}

总结

  1. map中的元素是键值对
  2. map中的key是唯一的,并且不能修改
  3. 默认按照小于的方式对key进行比较
  4. map中的元素如果用迭代器取遍历会得到一个有序序列
  5. map的底层是一个平衡搜索树,查找效率为\log_{2}N
  6. 支持[]操作符,operator[]中实际进行插入查找

multimap

        multimap和map基本类似,它们的唯一区别就是map中的key是唯一的,而multimap中的key是可以重复的

        multimap的接口可以参考map,功能都类似。其中insert会插入一个新的pair<key,value>不会取改变里面与key相同的value值

注:multimap中没有重载operator[]操作,这是因为key可以重复,operator[]不知道该去调用哪个key

http://www.dtcms.com/a/470789.html

相关文章:

  • 从数据库直连到缓存预热:城市列表查询的性能优化全流程
  • 大兴做网站免费追剧的app下载
  • 建设一个网站需要哪些网站优化 北京
  • CSS 子元素宽高继承与盒模型规则
  • 学习随笔-回流和重绘
  • 石狮网站建设哪家好游戏网站开发有限公司
  • 英语—四级CET4考试—技巧篇—听力—第二步—画选项/做标记
  • 窗口函数之全窗口函数
  • vue前端面试题——记录一次面试当中遇到的题(4)
  • 广州做手机网站咨询网站如何做权重
  • scsi存储通信协议及其发展
  • 地税局内网网站建设深圳印刷网站建设
  • 【Typora——MD编辑器】Typora最新 V1.12.1版:轻量级 Markdown 编辑器详细图文下载安装使用教程
  • SAM-SAM2-SAM3系列(一):Segment Anything Model(SAM)技术详解与实战
  • 利用DeepSeek辅助生成股市行情模拟数据测试电子表格插件rusty_sheet 0.2多表读取功能
  • 包头建站东莞手机微信网站
  • 珠海手机网站建设广州建设网站公司
  • 网站综合查询工具建筑工程网教
  • 医院网站需要前置审批苏州网站网络营销推广
  • 个人AI环境快速搭建
  • RAG优化实战:业务场景驱动的 Embedding 模型量化评估
  • 房地产活动策划网站电脑网站转换手机网站怎么做
  • 犀牛云网站建设怎么样做网站的心得体会
  • pc网站还有必要做吗泰安企业网站建设电话
  • 有了网站域名如何做网站多国语言网站
  • TCP中的拥塞控制
  • IP到IP间通讯
  • C 语言运算符优先级
  • dedecms网站地图前台路径不修改wordpress大学教程课件
  • 沈阳网站建设选网龙网页的网站建设在哪里