map的嵌套使用方法
vector可以理解为一种映射关系,给定指定的int值,都会返回与其对应的特定类型的值。
类比vector,map也可以理解一种映射关系,只不过比起vector更加灵活,给定值不再局限于int型,可以任意指定。
因此,从这个角度来理解map,对于算法题的使用可以十分灵活。对应的高维的map(嵌套map)也比较容易理解了。
定义一个嵌套的map;
map<int,map<int,int> >m1;
map<string,map<string,int> >m2;
此map的key值为int型,而value值则为map对象。
赋值操作:
m1[1][2] = 5;
m2["s1"]["t1"] = 7;
m2["s1"]["t5"] = 9;
m2["s3"]["t2"] = 5;
m2["s5"]["t7"] = 44;
遍历操作:
for(map<string,map<string,int> >::iterator it1 = m2.begin();it1!=m2.end();it1++)
{
cout<<it1->first<<endl;
for(map<string,int>::iterator it2 = it1->second.begin();it2 != it1->second.end();it2++)
cout<<it2->first<<" "<<it2->second<<endl;
}
输出结果:
在遍历的过程中,要注意几个点
- 第一行,两个右箭头中间要留有空格,不然会被当作是流操作而报错。
- it1是迭代器,简单理解可以当作指针,因此对其内部的值的访问只能用**"->“而不能用”."。而取到的value值即it1->second是一个map对象,因此对其操作只能用".“而不能用”->"**。故访问内部map的迭代器须写成:
map<string,int>::iterator it2 = it1->second.begin()
类似的,find()操作如下:
map<string,map<string,int> >::iterator ii;
ii = m2.find("s1");
if(ii!=m2.end())
{
cout<<ii->first<<endl;
map<string,int>::iterator ii2;
ii2 = ii->second.find("t5");
if(ii2!=ii->second.end())
cout<<ii2->first<<" "<<ii2->second<<endl;
}
其中,用到了两次find操作,find函数的返回值是一个迭代器,若查找失败,将返回end(),因此可以适当的进行find()操作。