• <map>的使用


        map是STL中常用的一个容器,下面介绍一下map。 

        (1) map是STL中的一个关联容器,它提供了一对一的数据处理能力,即一对一的映射,所以在实现一对一数据的时候,它提供了快速的通道。

        (2) 一对一的映射中,第一个参数是关键字key,并且每个关键字在map中只能出现一次。第二个参数是关键字key的值value。

        (3) map内部数据的组织方式:map内部自建了一棵红黑树(一种非严格意义上的平衡二叉树)。这棵树具有对数据自动排序的功能(默认为升序)。

    所以在map内部,所有数据都是有序的;标准的STLmap是以红黑树为底层机制完成的。

        (4) map是以泛型方式实现的,可存储任意类型的数据,包括自定义的数据类型。但是它的基本构造函数只有int、char、double、float、string等

    基本数据类型的任意组合,如果要用自定义数据类型需要重载构造函数。

        下面举几个例子来说明一下如何构造map容器:

        map<int,string> map;  //构造一个以int型数据为关键字,string型数据为关键字的值的map容器

        map<string,double> map;  //构造一个以string型数据为关键字,double型数据为关键字的值的map容器

        map<char,flaot> map;  //构造一个以char型数据为关键字,flaot型数据为它的值的map容器

        还有其他的一些类型,不再一一举例。

        构造好了map容器以后,就该向里面添加数据了,下面说一下怎么向map容器里添加数据

        1. 用成员函数insert()添加数据

         map<int,string> mp;
         pair<int,string>value(1,"abc");
         mp.insert( value);

        还可以这样添加:  mp.insert( pair<int,string>(1,"abc") ),这样添加的时候可以省略pair对象的名称;这两种方式是等价的。而在访问map的时候用迭代器,具体用法看代码

     1 #include<iostream>
     2 #include<string>
     3 #include<map>
     4 using namespace std;
     5 int main()
     6 {
     7     map<int,string> mp;
     8     pair<int,string>value1(1,"abc"); //创建一个pair对象,并初始化
     9     mp.insert(value1);   //第一次添加
    10     mp.insert(pair<int,string>(2,"def"));  //第二次添加
    11     int a;
    12     string str;
    13     cin>>a>>str;  //也可以从键盘输入
    14     pair<int,string>value2(a,str);  //创建一个pair对象,并初始化
    15     mp.insert(value2);   //第三次添加
    16     cin>>a>>str;
    17     mp.insert(pair<int,string>(a,str)); //第四次添加
    18     
    19     cout<<"------输出map------
    ";
    20     map<int,string>::iterator iter;
    21     for(iter=mp.begin();iter!=mp.end();iter++)
    22         cout<<iter->first<<"  "<<iter->second<<"
    ";  //用map自身的机制来访问关键字和关键字的值,其中first是关键字,second是关键字的值
    23     return 0;
    24 }

    结果如下:

        2. 还可以用数组的形式添加数据,不过此时数组的下标是关键字,下标可能int、double、flaot、char、string这些简单的数据类型,也可以是结构体等类型。

    具体用法还是看代码:
     1 #include<iostream>
     2 #include<string>
     3 #include<map>
     4 using namespace std;
     5 int main()
     6 {
     7     map<string,string> mp1;
     8     map<char,int> mp2;
     9     map<double,string> mp3;
    10     map<int,string> mp4;
    11 
    12     mp1["你好"]="hello";   //让关键字做下标,并通过下标给关键字一个值
    13     mp2['x']=45;
    14     mp3[3.6]="niubi";
    15     mp4[6]="six";
    16     cout<<"关键字“你好”的值:"<<mp1["你好"]<<"
    ";  //通过数组的形式访问输出,但这样只能访问关键字的值,无法访问关键字
    17     cout<<"关键字'x'的值:"<<mp2['x']<<"
    ";
    18     cout<<"关键字3.6的值:"<<mp3[3.6]<<"
    ";
    19     cout<<"关键字6的值:"<<mp4[6]<<"
    ";
    20 
    21     cout<<"------用迭代器访问map-------
    ";
    22     map<string,string>::iterator iter1; //也可以通过迭代器来访问,这样既可以访问关键字也可以访问关键字的值
    23     map<char,int>::iterator iter2;
    24     map<double,string>::iterator iter3;
    25     map<int,string>::iterator iter4;
    26     iter1=mp1.begin();
    27     iter2=mp2.begin();
    28     iter3=mp3.begin();
    29     iter4=mp4.begin();
    30     cout<<iter1->first<<"  "<<iter1->second<<"
    ";  
    31     cout<<iter2->first<<"  "<<iter2->second<<"
    ";  
    32     cout<<iter3->first<<"  "<<iter3->second<<"
    ";  
    33     cout<<iter4->first<<"  "<<iter4->second<<"
    ";  
    34     return 0;
    35 }

    结果如下:

         这里还要格外的强调一下,虽然这两种方法都能实现向map容器里面添加数据,但是用insert插入数据的时候涉及到了集合的唯一性。即当map容器中已有这个关键字的时候,

    insert操作是插入不了数据的。但是使用数组的话就可以插入进去,这时会覆盖掉该关键字之前所对应的值。例如下面两条语句

        mp.insert(pair<int,string>(1,"abc"));

        mp.insert(pair<int,string>(1,"defg")); 

        在执行这两条语句以后,关键字1对应的值仍然为"abc",因为第二条语句并没有生效。再看下面两条语句

        mp[1]="abc";

        mp[1]="defg";

        执行两条语句以后,关键字1对应的值变为了defg。可以通过此方法来修改关键字所对应的值。下面来验证一下,看代码

     1 #include<iostream>
     2 #include<string>
     3 #include<map>
     4 using namespace std;
     5 int main()
     6 {
     7     map<int,string> mp1,mp2;
     8     map<int,string>::iterator iter;
     9     mp1.insert(pair<int,string>(1,"abc"));
    10     iter=mp1.begin();
    11     cout<<"-------使用insert重复插入--------
    "<<iter->first<<"   "<<iter->second<<"
    ";
    12     mp1.insert(pair<int,string>(1,"defg")); 
    13     cout<<iter->first<<"   "<<iter->second<<"
    -------使用数组下标重复赋值--------
    ";
    14     mp2[1]="abc";
    15     iter=mp2.begin();
    16     cout<<iter->first<<"   "<<iter->second<<"
    ";
    17     mp2[1]="defg";
    18     cout<<iter->first<<"   "<<iter->second<<"
    ";
    19     return 0;
    20 }

    结果如下:

     通过结果我们发现,第一种方法是不能覆盖关键字的值的,而第二种方法可以覆盖关键字的值的。

  • 相关阅读:
    每日日报
    Serverless 架构模式及演进
    媒体声音|阿里云数据库:一站式全链路数据管理与服务,引领云原生2.0时代
    贾扬清谈云原生让数据湖加速迈入3.0时代
    阿里巴巴首席技术官程立:我们相信并正在践行的“好科技”
    Delphi外挂制作
    delphi获取汉字拼音首字母
    扫雷外挂的设计与实现
    access和SQL语句的区别
    调用C语言编写的DLL文件
  • 原文地址:https://www.cnblogs.com/buanxu/p/12793056.html
Copyright © 2020-2023  润新知