STL——map用法详解
2018-03-23 13:05
471 查看
map的功能
mapmap容器的功能在于,它建立了一对一的映射关系。例如,如果我们为了给学生编号定义了一个mapmap
map<string,int>studentmap<string,int>student
那么我们可以这样建立联系student["LZY"]=1student["LZY"]=1代表LZYLZY的学号是1号。假如有一天,我们忘记了他的学号,我们只要查询student["LZY"]student["LZY"]就可以了。
这里,map中的第一个元素我们称为关键词。关键词在每个map中最多只能出现一次。第二个元素是值。
我们还可以这样理解map:开创了一个数组类似物,下标是关键词,可以使任何东西。值也可以是任何东西(不一定是一个数据)。例如在ice
这题中,我们可以把一个结构体作为某一个点的下标,值是一个bool型的数组,来判断这个点是否被搜索过。
怎么理解关键词和值都可以是任何东西这句话呢
这就是map的功能强大之处。
例如map<int,set<int> >m;map<int,set<int> >m;
我们就建立了一个整数到集合的映射
定义完以后,我们可以把m[i]m[i]直接当做一个集合来用,例如m[i].insert()m[i].insert()等操作。
插入元素(方法三最实用)
mapmap是一个功能很强大的stlstl,它建立的是一个一对一的映射关系。这里我们来介绍怎么向这个容器中插入元素。
一共有三种方法
方法一 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""LZY"这一个字符串了……
方法二 insert函数插入value_type数据
这里value_typevalue_type是什么可以先不用管,只要知道有这种方式就可以了:代码:
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()size()函数。比如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();