对map最初的印象,源于王建德老师在山东NOIP夏令营上那销魂的一句“map,i,j”(音:唛颇,挨,杰= =)ruka上对map并没有讲很多,TY菌说map主要用来写哈希(虽然她曾用它写过邻接矩阵= =循环嵌套map intOrz),而李晨和里奥甚至表示基本不用map。但是既然有这一项奇妙的东西,想必是有用的,把前两节学的总结一下。
map是一个映射,也称关联数组,是一周关联式容器。和数学里的映射一样,每一个下标都有其一一对应的元素,功能上大致可以看作可以用各种数据类型做下标的数组。在这里我们不追究有的下标没有元素或有的元素没有下标的问题。据里奥、TY菌所言,map像是一个高级数组,但本质上是一个红黑树,无法直接输出,连迭代器和指针好像也不能直接输出,因为它是成对存储的元素。但这并不是意味着不能输出,可以用迭代器加上->second或是指针值加上.second这样。我在百度上看到有人这样说:
“map<string, int>::iterator map_it = word_count.begin();//可以这样理解么:给一个一个关联容器map的一个迭代器用.begin()成员函数赋值,赋值的结果是word_count的第一个值
cout << map_it->first;
迭代器就是指针。指向这个关联容器,关联容器有键和值,first就是键,second就是值。
这个程序后面还有一句
++map_it->second;这个这么理解呢?
写成++map_it->second;这样不好理解的话,你都写成++(*map_it).second;//自己补充:map_it迭代器相当于指针
其实就是指针。这里应该是对应键的值加1。”
map具有去重和自动排序功能,可以用count查出现次数,但是返回值最大是1;但multisets,multimaps返回值可以大于1【已证实
这里引用一下本站fangrk老师的话
“我们判断一个key是否存在,如果存在就输出,不存在就不输出
map<string, int> a;
cout<<a["abc"]<<endl;
如果a中间原本没有"abc",那么a["abc"]会把"abc"加入到a中间,因此不能使用这种方法
if(a.count("China")) //对了
cout<<a["China"]<<endl;
这种方法正确,但是效率不高:count先要查找一遍a,然后a["China"]又要查找一遍,我建议使用下面的方法:
map<string,int>::iterator fi=a.find("China");//查找是否有"China",返回一个迭代器
if(fi!=a.end()) cout<<a->second;//找到了,输出"China"对应的int值”
声明:
需要用到头文件map
map<string,int> cnt 建立一个map映射,键(key,就是下标)基类型为string,所指向的元素值(value)基类型为int,这个映射的名字叫做cnt
常用函数:
基本和set一致,支持insert、find、count、remove等。这里补充一下cnt.count()是用于查找某元素出现次数的函数 具体规则上面有介绍
在这里补充一个本站的链接:
http://blog.csdn.net/liucanrui/article/details/6591029
是很好的学习,有空可以常看一看。对这些东西现在我还知之甚少,我想在之后的学习过程中会慢慢加深,慢慢透过迷雾摸到它本质上的存在。
——伤情处,高城望断,灯火已黄昏
原文地址:http://blog.csdn.net/ametake/article/details/43699693