【日常学习】STL之map

对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

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

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

时间: 2024-08-04 04:29:14

【日常学习】STL之map的相关文章

STL之map容器的详解

一.关于map的介绍 map是STL的 一个容器,和set一样,map也是一种关联式容器.它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键 字的值)的数据处理能力,由于这个特性,有助于我们处理一对一数据.这里说下map内部数据的组织,map内部是自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的.学习map我们一定要理解什么是一对一的数据映射?比如:一个班级中,每个学生的学号跟他的姓名

C++ STL中Map的按Key排序和按Value排序

原文  http://blog.csdn.net/iicy266/article/details/11906189 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行存储就是个不错的选择. 我们这样定义,map<string, int>,其中学生姓名用string类型,作为Key:该学生的成绩用int类型,作为value.这样一来,我们可以根据学

Android:日常学习笔记(8)———探究UI开发(5)

Android:日常学习笔记(8)---探究UI开发(5) ListView控件的使用 ListView的简单用法 public class MainActivity extends AppCompatActivity { private String[] data={"Apple","Banana","Orange","Watermelon","Pear","Grape","

HDU Bombing (STL multiset+map)

题意:给你 n 个坐标(x,y),m 个询问(c,d) c==0,求出x==d有多少个,并删除这些点: c==1,求出y==d有多少个,并删除这些点. map+multiset的多重映射 #include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<map> #include<cmath> #include<iostream>

Android:日常学习笔记(10)———使用LitePal操作数据库

Android:日常学习笔记(10)---使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式,将平时开发时最常用的一些数据库功能进行了封装,使得开发者不用编写一行SQL语句就可以完成各种建表.増删改查的操作.并且LitePal很"轻",jar包大小不到100k,而且近乎零配置,这一点和Hibernate这类的框架有很大区别.目前LitePal的源码已经托管到了GitHub上. 关

STL中map与hash_map容器的选择

[转]STL中map与hash_map容器的选择 先看看alvin_lee 朋友做的解析,我觉得还是很正确的,从算法角度阐述了他们之间的问题! 实际上这个问题不光C++会遇到,其他所有语言的标准容器的实现及选择上都是要考虑的.做应用程序你可能觉得影响不大,但是写算法或者核心代码就要小心了.今天改进代码,顺便又来温习基础功课了. 还记得Herb Sutter那极有味道的<C++对话系列>么,在其中<产生真正的hash对象>这个故事里就讲了map的选择.顺便回顾一下,也讲一下我在实用中

STL中map与hash_map的比较

1. map : C++的STL中map是使用树来做查找算法; 时间复杂度:O(log2N) 2. hash_map : 使用hash表来排列配对,hash表是使用关键字来计算表位置; 时间复杂度:O(1), 最坏的时间复杂度:O(n) 总体来说:hash_map 比 map 查找速度快,而且查找速度基本和数据量大小无关,属于常数级别,节省一定内存,如果没有必要排序的话,尽量使用 hash_map . 注:hash还有hash函数的耗时.当有100w条记录的时候,map也只需要20次的比较,20

【工作中学习2】Map的使用及排序(第三个参数)

项目进行中,使用到Map(std::map),Map要点整理如下: 1. Map,也叫关联数组,提供key/value(键/值对),key用来索引,value是被存储和检索的数据. 2. key值唯一(Multimap除外). 3. Map的内部数据结构是红黑树. 3. 可以用下标操作符,添加Map中的数据,例如map[1] = 2;,用下标操作符查找数据时,如果数据不存在,会被自动插入到Map中. 4. Map中的数据默认按照由key从小到大排序(less),可以修改第三个参数(可选)来修改排

Android:日常学习笔记(6)——探究活动(3)

Android:日常学习笔记(6)--探究活动(3) 活动的生命周期 返回栈 Android中的活动是可以叠加的,我们每启动一个新活动,就会覆盖在原来的活动上,点击Back以后销毁最上面的活动,下面的活动就会重新显现出来.Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合. 默认情况下,每当我们启动一个新的活动,他会在返回栈中入栈,并处于栈顶位置.而每当我们按下Back或者Finish以后,处于栈顶位置的活动会出栈. 活动的状态 运行状态(栈顶的元素).暂停

Android:日常学习笔记(8)———探究UI开发(2)

Android:日常学习笔记(8)---探究UI开发(2) 对话框 说明: 对话框是提示用户作出决定或输入额外信息的小窗口. 对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件. 提示: Dialog 类是对话框的基类,但您应该避免直接实例化 Dialog,而是使用下列子类之一: AlertDialog此对话框可显示标题.最多三个按钮.可选择项列表或自定义布局. DatePickerDialog 或 TimePickerDialog此对话框带有允许用户选择日期或时间的预定义 UI