<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------\n";
20     map<int,string>::iterator iter;
21     for(iter=mp.begin();iter!=mp.end();iter++)
22         cout<<iter->first<<"  "<<iter->second<<"\n";  //用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["你好"]<<"\n";  //通过数组的形式访问输出,但这样只能访问关键字的值,无法访问关键字
17     cout<<"关键字'x'的值:"<<mp2['x']<<"\n";
18     cout<<"关键字3.6的值:"<<mp3[3.6]<<"\n";
19     cout<<"关键字6的值:"<<mp4[6]<<"\n";
20 
21     cout<<"------用迭代器访问map-------\n";
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<<"\n";  
31     cout<<iter2->first<<"  "<<iter2->second<<"\n";  
32     cout<<iter3->first<<"  "<<iter3->second<<"\n";  
33     cout<<iter4->first<<"  "<<iter4->second<<"\n";  
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重复插入--------\n"<<iter->first<<"   "<<iter->second<<"\n";
12     mp1.insert(pair<int,string>(1,"defg")); 
13     cout<<iter->first<<"   "<<iter->second<<"\n-------使用数组下标重复赋值--------\n";
14     mp2[1]="abc";
15     iter=mp2.begin();
16     cout<<iter->first<<"   "<<iter->second<<"\n";
17     mp2[1]="defg";
18     cout<<iter->first<<"   "<<iter->second<<"\n";
19     return 0;
20 }

结果如下:

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

posted @ 2020-04-28 14:46  和运气碰碰  阅读(999)  评论(0编辑  收藏  举报