c++ map 函数

c++
  Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。
  1. map的构造函数
  map<int, string> maphai;
  map<char,int> maphai;
  map<string,char> mapstring;
  map<string,int> mapstring;
  map<int ,char>mapint;
  map<char,string>mapchar;
  2. 数据的插入
  在构造map容器后,我们就可以往里面插入数据了。这里讲三种插入数据的方法:
  第一种:用insert函数插入pair数据,
  #include <map>
  #include <string>
  #include <iostream>
  Using namespace std;
  Int main()
  {
  Map<int, string> mapStudent;
  mapStudent.insert(pair<int, string>(1, “student_one”));
  mapStudent.insert(pair<int, string>(2, “student_two”));
  mapStudent.insert(pair<int, string>(3, “student_three”));
  map<int, string>::iterator iter;
  for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
  {
  Cout<<iter->first<<” ”<<iter->second<<end;
  }
  }
  第二种:用insert函数插入value_type数据,下面举例说明
  #include <map>
  #include <string>
  #include <iostream>
  Using namespace std;
  Int main()
  {
  Map<int, string> mapStudent;
  mapStudent.insert(map<int, string>::value_type (1, “student_one”));
  mapStudent.insert(map<int, string>::value_type (2, “student_two”));
  mapStudent.insert(map<int, string>::value_type (3, “student_three”));
  map<int, string>::iterator iter;
  for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
  {
  Cout<<iter->first<<” ”<<iter->second<<end;
  }
  }
  第三种:用数组方式插入数据,下面举例说明
  #include <map>
  #include <string>
  #include <iostream>
  Using namespace std;
  Int main()
  {
  Map<int, string> mapStudent;
  mapStudent[1] = “student_one”;
  mapStudent[2] = “student_two”;
  mapStudent[3] = “student_three”;
  map<int, string>::iterator iter;
  for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
  {
  Cout<<iter->first<<” ”<<iter->second<<end;
  }
  }
  以上三种用法,虽然都可以实现数据的插入,但是它们是有区别的,当然了第一种和第二种在效果上是完成一样的,用insert函数插入数据,在数据的插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是插入数据不了的,但是用数组方式就不同了,它可以覆盖以前该关键字对应的值,用程序说明
  mapStudent.insert(map<int, string>::value_type (1, “student_one”));
  mapStudent.insert(map<int, string>::value_type (1, “student_two”));
  上面这两条语句执行后,map中1这个关键字对应的值是“student_one”,第二条语句并没有生效,那么这就涉及到我们怎么知道insert语句是否插入成功的问题了,可以用pair来获得是否插入成功,程序如下
  Pair<map<int, string>::iterator, bool> Insert_Pair;
  Insert_Pair = mapStudent.insert(map<int, string>::value_type (1, “student_one”));
  我们通过pair的第二个变量来知道是否插入成功,它的第一个变量返回的是一个map的迭代器,如果插入成功的话Insert_Pair.second应该是true的,否则为false。
  下面给出完成代码,演示插入成功与否问题
  #include <map>
  #include <string>
  #include <iostream>
  Using namespace std;
  Int main()
  {
  Map<int, string> mapStudent;
  Pair<map<int, string>::iterator, bool> Insert_Pair;
  Insert_Pair = mapStudent.insert(pair<int, string>(1, “student_one”));
  If(Insert_Pair.second == true)
  {
  Cout<<”Insert Successfully”<<endl;
  }
  Else
  {
  Cout<<”Insert Failure”<<endl;
  }
  Insert_Pair = mapStudent.insert(pair<int, string>(1, “student_two”));
  If(Insert_Pair.second == true)
  {
  Cout<<”Insert Successfully”<<endl;
  }
  Else
  {
  Cout<<”Insert Failure”<<endl;
  }
  map<int, string>::iterator iter;
  for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
  {
  Cout<<iter->first<<” ”<<iter->second<<end;
  }
  }
  大家可以用如下程序,看下用数组插入在数据覆盖上的效果
  #include <map>
  #include <string>
  #include <iostream>
  Using namespace std;
  Int main()
  {
  Map<int, string> mapStudent;
  mapStudent[1] = “student_one”;
  mapStudent[1] = “student_two”;
  mapStudent[2] = “student_three”;
  map<int, string>::iterator iter;
  for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
  {
  Cout<<iter->first<<” ”<<iter->second<<end;
  }
  }
  3. map的大小
  在往map里面插入了数据,我们怎么知道当前已经插入了多少数据呢,可以用size函数,用法如下:
  Int nSize = mapStudent.size();
  4. 数据的遍历
  这里也提供三种方法,对map进行遍历
  第一种:应用前向迭代器,上面举例程序中到处都是了,略过不表
  第二种:应用反相迭代器,下面举例说明,要体会效果,请自个动手运行程序
  #include <map>
  #include <string>
  #include <iostream>
  Using namespace std;
  Int main()
  {
  Map<int, string> mapStudent;
  mapStudent.insert(pair<int, string>(1, “student_one”));
  mapStudent.insert(pair<int, string>(2, “student_two”));
  mapStudent.insert(pair<int, string>(3, “student_three”));
  map<int, string>::reverse_iterator iter;
  for(iter = mapStudent.rbegin(); iter != mapStudent.rend(); iter++)
  {
  Cout<<iter->first<<” ”<<iter->second<<end;
  }
  }
  第三种:用数组方式,程序说明如下
  #include <map>
  #include <string>
  #include <iostream>
  Using namespace std;
  Int main()
  {
  Map<int, string> mapStudent;
  mapStudent.insert(pair<int, string>(1, “student_one”));
  mapStudent.insert(pair<int, string>(2, “student_two”));
  mapStudent.insert(pair<int, string>(3, “student_three”));
  int nSize = mapStudent.size()
  //此处有误,应该是 for(int nIndex = 1; nIndex <= nSize; nIndex++) 
  //by rainfish
  for(int nIndex = 0; nIndex < nSize; nIndex++)
  {
  Cout<<mapStudent[nIndex]<<end;
  }
  }
  5. 数据的查找(包括判定这个关键字是否在map中出现)
  在这里我们将体会,map在数据插入时保证有序的好处。
  要判定一个数据(关键字)是否在map中出现的方法比较多,这里标题虽然是数据的查找,在这里将穿插着大量的map基本用法。
  这里给出三种数据查找方法
  第一种:用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了
  第二种:用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器,程序说明
  #include <map>
  #include <string>
  #include <iostream>
  Using namespace std;
  Int main()
  {
  Map<int, string> mapStudent;
  mapStudent.insert(pair<int, string>(1, “student_one”));
  mapStudent.insert(pair<int, string>(2, “student_two”));
  mapStudent.insert(pair<int, string>(3, “student_three”));
  map<int, string>::iterator iter;
  iter = mapStudent.find(1);
  if(iter != mapStudent.end())
  {
  Cout<<”Find, the value is ”<<iter->second<<endl;
  }
  Else
  {
  Cout<<”Do not Find”<<endl;
  }
  }
  第三种:这个方法用来判定数据是否出现,是显得笨了点,但是,我打算在这里讲解
  Lower_bound函数用法,这个函数用来返回要查找关键字的下界(是一个迭代器)
  Upper_bound函数用法,这个函数用来返回要查找关键字的上界(是一个迭代器)
  例如:map中已经插入了1,2,3,4的话,如果lower_bound(2)的话,返回的2,而upper-bound(2)的话,返回的就是3
  Equal_range函数返回一个pair,pair里面第一个变量是Lower_bound返回的迭代器,pair里面第二个迭代器是Upper_bound返回的迭代器,如果这两个迭代器相等的话,则说明map中不出现这个关键字,程序说明
  #include <map>
  #include <string>
  #include <iostream>
  Using namespace std;
  Int main()
  {
  Map<int, string> mapStudent;
  mapStudent[1] = “student_one”;
  mapStudent[3] = “student_three”;
  mapStudent[5] = “student_five”;
  map<int, string>::iterator iter;
  iter = mapStudent.lower_bound(2);
  {
  //返回的是下界3的迭代器
  Cout<<iter->second<<endl;
  }
  iter = mapStudent.lower_bound(3);
  {
  //返回的是下界3的迭代器
  Cout<<iter->second<<endl;
  }
  iter = mapStudent.upper_bound(2);
  {
  //返回的是上界3的迭代器
  Cout<<iter->second<<endl;
  }
  iter = mapStudent.upper_bound(3);
  {
  //返回的是上界5的迭代器
  Cout<<iter->second<<endl;
  }
  Pair<map<int, string>::iterator, map<int, string>::iterator> mapPair;
  mapPair = mapStudent.equal_range(2);
  if(mapPair.first == mapPair.second)
  {
  cout<<”Do not Find”<<endl;
  }
  Else
  {
  Cout<<”Find”<<endl;
  }
  mapPair = mapStudent.equal_range(3);
  if(mapPair.first == mapPair.second)
  {
  cout<<”Do not Find”<<endl;
  }
  Else
  {
  Cout<<”Find”<<endl;
  }
  }
  6. 数据的清空与判空
  清空map中的数据可以用clear()函数,判定map中是否有数据可以用empty()函数,它返回true则说明是空map
  7. 数据的删除
  这里要用到erase函数,它有三个重载了的函数,下面在例子中详细说明它们的用法
  #include <map>
  #include <string>
  #include <iostream>
  Using namespace std;
  Int main()
  {
  Map<int, string> mapStudent;
  mapStudent.insert(pair<int, string>(1, “student_one”));
  mapStudent.insert(pair<int, string>(2, “student_two”));
  mapStudent.insert(pair<int, string>(3, “student_three”));
  //如果你要演示输出效果,请选择以下的一种,你看到的效果会比较好
  //如果要删除1,用迭代器删除
  map<int, string>::iterator iter;
  iter = mapStudent.find(1);
  mapStudent.erase(iter);
  //如果要删除1,用关键字删除
  Int n = mapStudent.erase(1);//如果删除了会返回1,否则返回0
  //用迭代器,成片的删除
  //一下代码把整个map清空
  mapStudent.earse(mapStudent.begin(), mapStudent.end());
  //成片删除要注意的是,也是STL的特性,删除区间是一个前闭后开的集合
  //自个加上遍历代码,打印输出吧
  }
  8. 其他一些函数用法
  这里有swap,key_comp,value_comp,get_allocator等函数,感觉到这些函数在编程用的不是很多,略过不表,有兴趣的话可以自个研究
  9. 排序
  这里要讲的是一点比较高深的用法了,排序问题,STL中默认是采用小于号来排序的,以上代码在排序上是不存在任何问题的,因为上面的关键字是int型,它本身支持小于号运算,在一些特殊情况,比如关键字是一个结构体,涉及到排序就会出现问题,因为它没有小于号操作,insert等函数在编译的时候过不去,下面给出两个方法解决这个问题
  第一种:小于号重载,程序举例
  #include <map>
  #include <string>
  Using namespace std;
  Typedef struct tagStudentInfo
  {
  Int nID;
  String strName;
  }StudentInfo, *PStudentInfo; //学生信息
  Int main()
  {
  int nSize;
  //用学生信息映射分数
  map<StudentInfo, int>mapStudent;
  map<StudentInfo, int>::iterator iter;
  StudentInfo studentInfo;
  studentInfo.nID = 1;
  studentInfo.strName = “student_one”;
  mapStudent.insert(pair<StudentInfo, int>(studentInfo, 90));
  studentInfo.nID = 2;
  studentInfo.strName = “student_two”;
  mapStudent.insert(pair<StudentInfo, int>(studentInfo, 80));
  for (iter=mapStudent.begin(); iter!=mapStudent.end(); iter++)
  cout<<iter->first.nID<<endl<<iter->first.strName<<endl<<iter->second<<endl;
  }
  以上程序是无法编译通过的,只要重载小于号,就OK了,如下:
  Typedef struct tagStudentInfo
  {
  Int nID;
  String strName;
  Bool operator < (tagStudentInfo const& _A) const
  {
  //这个函数指定排序策略,按nID排序,如果nID相等的话,按strName排序
  If(nID < _A.nID) return true;
  If(nID == _A.nID) return strName.compare(_A.strName) < 0;
  Return false;
  }
  }StudentInfo, *PStudentInfo; //学生信息
  第二种:仿函数的应用,这个时候结构体中没有直接的小于号重载,程序说明
  #include <map>
  #include <string>
  Using namespace std;
  Typedef struct tagStudentInfo
  {
  Int nID;
  String strName;
  }StudentInfo, *PStudentInfo; //学生信息
  Classs sort
  {
  Public:
  Bool operator() (StudentInfo const &_A, StudentInfo const &_B) const
  {
  If(_A.nID < _B.nID) return true;
  If(_A.nID == _B.nID) return _A.strName.compare(_B.strName) < 0;
  Return false;
  }
  };
  Int main()
  {
  //用学生信息映射分数
  Map<StudentInfo, int, sort>mapStudent;
  StudentInfo studentInfo;
  studentInfo.nID = 1;
  studentInfo.strName = “student_one”;
  mapStudent.insert(pair<StudentInfo, int>(studentInfo, 90));
  studentInfo.nID = 2;
  studentInfo.strName = “student_two”;
  mapStudent.insert(pair<StudentInfo, int>(studentInfo, 80));

  }

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

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

相关文章

通过 Jenkins 构建 CI/CD 实现全链路灰度

本文介绍通过 Jenkins 构建流水线的方式实现全链路灰度功能。在发布过程中&#xff0c;为了整体稳定性&#xff0c;我们总是希望能够用小部分特定流量来验证下新发布应用是否正常。 即使新版本有问题&#xff0c;也能及时发现&#xff0c;控制影响面&#xff0c;保障了整体的稳…

合阔智云核心生产系统切换到服务网格 ASM 的落地实践

背景 合阔智云(http://www.hexcloud.cn) 是专注于为大中型零售连锁行业&#xff0c;提供全渠道业务中/前台产品和解决方案&#xff0c;并建立以消费者为中心的全渠道交易和敏捷供应链的新一代零售运营协同平台。 合阔智云提供了从全渠道交易管理到订单履约再到门店供应链完整…

Serverless 架构下的 AI 应用开发:入门、实战与性能优化

随着时间的推移&#xff0c;Serverless 架构变得越来越火热&#xff0c;凭借着极致弹性、按量付费、低成本运维等特性&#xff0c;在很多领域发挥着越来越重要的作用&#xff1b;机器学习领域在近些年也非常火热&#xff0c;并在越来越多的行业中得到应用。 实际上&#xff0c…

数据变更白屏化利器 - 推送轨迹上线

背景 Zookeeper 可作为注册配置中心&#xff0c;选主&#xff0c;分布式锁等多种场景&#xff0c;随着业务规模的扩大&#xff0c;业务之间的依赖关系逐渐变得复杂&#xff0c;在这种复杂的场景下如果遇到变更推送相关问题&#xff0c;排查起来相当困难&#xff0c;虽然 Zooke…

我们总结了弹性伸缩的五个条件与六个教训

前言 弹性伸缩是云计算时代给我们带来的一项核心技术红利&#xff0c;但是 IT 的世界中&#xff0c;没有一个系统功能可以不假思索的应用到所有的场景中。这篇文章&#xff0c;我们将应用企业级分布式应用服务-EDAS 的客户在进行系统架构设计时&#xff0c;在弹性场景下遇到的…

KubeVela 1.5:灵活框选 CNCF 原子能力打造独特的企业应用发布平台

KubeVela 1.5 于近日正式发布。在该版本中为社区带来了更多的开箱即用的应用交付能力&#xff0c;包括新增系统可观测&#xff1b;新增 Cloud Shell 终端&#xff0c;将 Vela CLI 搬到了浏览器&#xff1b;增强的金丝雀发布&#xff1b;优化多环境应用交付工作流等。进一步提升…

开源小白到核心开发——我与 sealer 的成长故事

个人简介 大家好&#xff0c;我是周欣元&#xff0c;本科就读于杭州师范大学&#xff0c;今年 9 月将去往云南大学进行研究生学习。本科研究方向为 docker 容器在网络攻防中的应用&#xff0c;目前作为 sealer member 加入了核心模块 sealer runtime 的研发工作。 个人主页&a…

全链路灰度新功能:MSE 上线配置标签推送

背景 微服务场景下&#xff0c;全链路灰度作为一种低成本的新功能验证方式&#xff0c;得到了越来越广泛的应用。除了微服务实例和流量的灰度&#xff0c;微服务应用中的配置项也应该具备相应的灰度能力&#xff0c;以应对灰度应用对特殊配置的诉求。 为什么需要配置标签推送…

hdu3527spy(STL,map)

Description The NationalIntelligence(情报工作) Council(委员会) of X Nation receives a piece ofcredible(可靠的) informationthat Nation Y will send spies(间谍) to stealNation X’s confidential(机密的) paper. So thecommander(指挥官) of TheNational Intelligen…

万节点规模云服务的 SRE 能力建设

背景及现状 系统架构简介 上图为阿里云内部实际使用的系统架构&#xff0c;系统主要用途为实时数据流的计算和存储。使用阿里云的容器服务 ACK 作为系统底座&#xff0c;容器化的部署、发布、管控等全部基于 K8s 标准。使用自己开发的 Gateway service 作为系统流量入口&#…

HDU 3532 Max Angle(计算几何——极角排序)

Description Given manypoints in a plane, two players are playing an interesting game. Player1 selects one point A as the vertex(顶点) of an angle. Then player2 selects other two points Band C. A, B and C are different with each other. Now they get an an…

阿里云 ACK 容器服务生产级可观测体系建设实践

ACK 可观测体系介绍 全景概要介绍 上图为 ACK 可观测体系全景图金字塔&#xff0c;从上至下可分为四层&#xff1a; 最上层是最接近用户业务的 Business Monitoring&#xff0c;包括用户业务的前端的流量、PV、前端性能、JS 响应速度等监控。通过容器服务的 IngressDashboard…

中仑网络全站 Dubbo 2 迁移 Dubbo 3 总结

中仑网络在 2022 年完成了服务框架从 Dubbo 2 到 Dubbo 3 的全站升级&#xff0c;深度使用了应用级服务发现、Kubernetes 原生服务部署、服务治理等核心能力。来自中仑网络的技术负责人来彬彬对整个 Dubbo 3 的选型、升级过程及收益等做了深入总结。 来彬彬&#xff0c;2020 年…

hdu3526(最小费用流)

Description Xiao A isbecoming more and more unsatisfied with his computer since he is learninghacker(黑客技术) technologiesthese days but his computer always fails whenever he changes the configurationsof the NIC. He buys a new NIC but the motherboard doe…

hdu3530Subsequence【单调队列优化dp】2010多校联合

Description There is asequence(顺序&#xff0c;序列) of integers.Your task is to find the longest subsequence(子序列) that satisfies the following condition: the differencebetween the maximum element and the minimum element of the subsequence is nosmaller…

基于 OpenYurt 和 EdgeX 的云边端协同新可能

2022 EdgeX 中国挑战赛暨中关村国际前沿科技创新大赛 EdgeX 专题赛正式拉开帷幕。本次大赛分设两大赛道&#xff1a;医疗、教育、消费行业赛道和能源、工业、供应链赛道。大赛致力于构建一个物联网及边缘计算的学习和分享平台&#xff0c;基于 EdgeX Foundry、OpenYurt 等开源技…

OSCAR 2022 开源产业大会PolarDB-X、 PolarDB-PG获奖揭晓

9月16日&#xff0c;OSCAR 2022 开源产业大会在京召开&#xff0c;会议由中国信息通信研究院、中国通信标准化协会主办&#xff0c;中国通信标准化协会云计算标准和开源推进委员会承办。此次会议以“千行百业 可信开源”为主题&#xff0c;邀请上百位专家大咖和国内主流的开源社…

C链表(顺序表、静态链表区别)

#include <stdio.h> #include <stdlib.h> #define LIST_INIT_SIZE 1000 //线性表存储空间的初始分配量 #define LISTINCRESEMENT 100 //线性表存储空间的分配增量 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int elemType;//元素类型…

HDU3534 给你一个树让你找出其中最长路径以及个数数

Description In the Datastructure class of HEU, the teacher asks one problem: How to find the longestpath(路径) of one treeand the number of such longest path? Input There are several test cases. The firstline of each case contains only one integer N, m…

国庆训练赛

Description Consider the following programming language. This language contains only two types of statements: simple statements and compound statements. The simple statement is in the form “write (literal)”, where “write” is a key word indicating that …