码迷,mamicode.com
首页 > 其他好文 > 详细

【日常学习】STL之map

时间:2015-02-10 11:19:47      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:迭代器   map   stl   日常学习   

对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

是很好的学习,有空可以常看一看。对这些东西现在我还知之甚少,我想在之后的学习过程中会慢慢加深,慢慢透过迷雾摸到它本质上的存在。


——伤情处,高城望断,灯火已黄昏

【日常学习】STL之map

标签:迭代器   map   stl   日常学习   

原文地址:http://blog.csdn.net/ametake/article/details/43699693

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!