acm的STL容器之Map篇

1.对map的简单介绍

 Map是STL的一个关联容器,它提供一对一(其中第一个称为关键字,每一个关键字只能在map中出现一次,第二个称为该关键字的值)的数据处理能力。html

这里说下map内部数据的组织,map内部自建一颗红黑树,这颗树具备对数据自动排序的功能,因此在map内部全部的数据都是有序的。java

2.map功能介绍

 map利用k-v,即Key - value。key 和 value能够声明成任意你须要的类型。ios

查找的复杂度基本是Log(N),若是有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。c++

map的经常使用操做:数组

快速插入Key -Value 记录。函数

快速删除记录spa

根据Key 修改value记录。code

遍历全部记录。htm

3.map的声明

 须要声明头文件,并使用命名空间std。对象

#include<iostream>
#include<map>
using namespace std;

  声明一个map。根据我的命名规范习惯,推荐int-int类型的map叫 iimap,若是是<int,string>类型的推荐叫 ismap

一半声明了map后,为了之后查询、遍历、删除等方便,咱们顺便声明iterator

map<int,int> iimap;
map<int,int>::iterator iter;

  

4.数据的插入、删除、数量、清空

 先不写查询,放在遍历那里一块儿写。

有2种方法能够向map中填入数据,第一种是用相似数组的方式。

ismap[1] = "hello";

 这样,字符串“hello”的key就是1.

还有一种是

iimap.insert(pair<int,int>(a,b));

 (我这里使用的第一个是<int,string>,第二个是<int,int>)

这两种方式有区别,第一种数组的方法能够覆盖重复key值的value,第二种插入时若key已经存在,则插入无效。

固然,第二种方法能够用pair来查询数据是否插入成功(acm中一般不使用),这里给代码,不做详解。

 1   map<int, string> ismap;  
 2   
 3     pair<map<int, string>::iterator, bool> Insert_Pair;  
 4   
 5     Insert_Pair = ismap.insert(pair<int, string>(1, "hello"));  
 6   
 7     if(Insert_Pair.second == true)  
 8   
 9         cout<<"Insert Successfully"<<endl;  
10   
11     else  
12   
13         cout<<"Insert Failure"<<endl;  

 

数据数量查询(map中数据样本多少)

iimap.size();

 

清空map的操做

iimap.clear();

 

从map中删除特定元素

移除某个map中某个条目用erase()

该成员方法的定义以下:

iterator erase(iterator it);//经过一个条目对象删除

iterator erase(iterator first,iterator last)//删除一个范围

size_type erase(const Key&key);//经过关键字删除

刚才提到的clear()就至关于enumMap.erase(enumMap.begin(),enumMap.end());

这里只演示删除某key值和其对应的value

1 map<int, string>::iterator iter; 2 //第一种,经过iter删除 3 iter = ismap.find(1); 4 5  ismap.erase(iter); 6 7  //第二种,直接在erase()的括号中填入key,能够不用n,只是删除无论返回值 8      //这样的话会有一个返回值,这里用n来接收,删除了会返回1,不然返回0  9 int n = ismap.erase(1);

 

5.数据的查询和遍历

刚才的移除元素已经用到了iterator,接下来咱们都要用。一般用第二种方法。

查找一个元素是否存在的两种方式:

第一种:用count函数来断定关键字是否出现,其缺点是没法定位数据出现位置。

因为map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的状况,固然是返回1了

因为比赛中用得比较少,你们自行体会,代码就不放了。

 

第二种:用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,若是map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。

查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里须要提到的是begin()和end()两个成员,

分别表明map对象中第一个条目和最后一个条目,这两个数据的类型是iterator.

由于咱们已经声明过iterator了,因此就方便不少,直接用iter=ismap.find(index)来查找,而后使用一个if语句来判断。

1 iter = ismap.find(1);  
2   //若是不存在则返回end(),因此若是!end()就是存在(iter->First是输出key,iter->second输出value)
3     if(iter != ismap.end())  
4   
5        cout<<"Find, the value is "<<iter->second<<endl;  
6   
7     else  
8   
9        cout<<"Do not Find"<<endl;  

我的感受c++的容器搞得没java好,比较麻烦,好怀念containKey()这种操做。

接下来是遍历,也是用iter就能够了。

1 for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)  {
2   //第一种方法,直接使用iter 
3         cout<<iter->first<<' '<<iter->second<<endl;  
4   
5 }  
 1 int ismapSize = ismap.size();  
 2  //第二种方法,数组法
 3 //注意,这里是 for(int i = 1; i <= ismapSize; i++)  
 4 //而不是 for(int i = 0; i < ismapSize; i++)  
 5   
 6     for(int i = 1; i <= ismapSize; i++){ 
 7   
 8         cout<<ismap[i]<<endl;  
 9   
10 }  

 

附上表:

  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的函数

 

 关于map有不少其余操做,可是在比赛中不经常使用,因此在这里不列举

这里加上了我本身的理解和对知识的整理概括,参考原文连接:https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html

相关文章
相关标签/搜索