STL——map用法详解

map的功能

map m a p 容器的功能在于,它建立了一对一的映射关系。
例如,如果我们为了给学生编号定义了一个 map m a p

map<string,int>student m a p < s t r i n g , i n t > s t u d e n t

那么我们可以这样建立联系 student["LZY"]=1 s t u d e n t [ " L Z Y " ] = 1 代表 LZY L Z Y 的学号是1号。假如有一天,我们忘记了他的学号,我们只要查询 student["LZY"] s t u d e n t [ " L Z Y " ] 就可以了。


这里,map中的第一个元素我们称为关键词。关键词在每个map中最多只能出现一次。第二个元素是值。


我们还可以这样理解map:开创了一个数组类似物,下标是关键词,可以使任何东西。值也可以是任何东西(不一定是一个数据)。例如在ice
这题中,我们可以把一个结构体作为某一个点的下标,值是一个bool型的数组,来判断这个点是否被搜索过。


怎么理解关键词和值都可以是任何东西这句话呢
这就是map的功能强大之处。
例如

map<int,set<int> >m; m a p < i n t , s e t < i n t >   > m ;

我们就建立了一个整数到集合的映射
定义完以后,我们可以把 m[i] m [ i ] 直接当做一个集合来用,例如 m[i].insert() m [ i ] . i n s e r t ( ) 等操作。

插入元素(方法三最实用)

map m a p 是一个功能很强大的 stl s t l ,它建立的是一个一对一的映射关系。
这里我们来介绍怎么向这个容器中插入元素。
一共有三种方法

方法一 insert函数插入pair

直接上代码吧

map<int,string>m;
m.insert(pair<int, string>(1,“LZY”));
m.insert(pair<int, string>(2,“YTY”));
m.insert(pair<int, string>(3,“YCY”));

这样,整数1对应的就是 "LZY" " L Z Y " 这一个字符串了……

方法二 insert函数插入value_type数据

这里 value_type v a l u e _ t y p e 是什么可以先不用管,只要知道有这种方式就可以了:
代码:

map<int,string>m;
m.insert(map<int, string>::value_type (1, "LZY"));
m.insert(map<int, string>::value_type (1, "YTY"));
m.insert(map<int, string>::value_type (1, "YCY"));

方法三 数组方式直接赋值

map<int,string>m;
m[1]="LZY";
m[2]="YTY";
m[3]="YCY";

注意点

上面三段代码,效果都是一样的。
但是下面两端代码不是一样的效果。

map<int,string>m;
m[1]="YTY";
m[1]="LZY";
map<int,string>m;
m.insert(map<int, string>::value_type (1, "LZY"));
m.insert(map<int, string>::value_type (1, "YTY"));

第一段代码的最终结果,1对应着”YTY”,第二段代码的最终结果,1对应着”LZY”。
很明显,第二段代码的第二条insert语句没有发挥作用。
因为insert向其中插入 关 键 词 — — 值 的时候,关键词涉及到一个集合的不重复性。但是数组赋值的时候会直接覆盖。

容器的大小

size() s i z e ( )
函数。比如

map<int,string>m;
int a=m.size();

容器的遍历

三种方法。第一种和第二种是有一定的顺序(如以关键词递增或者以关键词递减 的顺序 遍历)

用前向迭代器进行遍历

map<int,string>m;
m[1]=“YTY”;
m[2]=“LZY”;
m[3]=“YCY”;
map<int,string>::iterator iter;
for(iter=m.begin();iter!=m.end(); iter++)
{
       cout<<iter.first<<”   ”<<iter.second<<end;
}

用反向迭代器遍历

map<int,string>m;
m[1]=“YTY”;
m[2]=“LZY”;
m[3]=“YCY”;
map<int,string>::reverse_iterator iter;
for(iter=m.rbegin();iter!=m.rend(); iter++)
{
       cout<<iter.first<<”   ”<<iter.second<<end;
}

用数组方式

map<int,string>m;
m[1]=“YTY”;
m[2]=“LZY”;
m[3]=“YCY”;
int nSize=m.size();
for(int nIndex = 1; nIndex <= nSize; nIndex++) 
{
       cout<<m[nIndex]<<end;
}

清空和判空

清空:m.clear();
判空:m.empty();

查找find函数

m.find(x)函数可以查找某一个关键词x是否出现过,如果出现过就返回这个映射的迭代器,如果没有出现过就返回 m.end() m . e n d ( )

删除erase函数

m.erase(x)函数可以删除以x为关键词的一对映射。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值