Map容器,顾名思义,地图,是用来进行索引的一个容器。
在定义Map容器之前,c++首先定义了一个pair类型,这个类型有两个参数pair<T1,T2>。
pair类型的对象通过点号(.)访问其成员(都是公有成员)first与second。
pair类型可以通过make_pair()函数来进行初始化。
下面定义map类型的对象
map<string ,int> objmap;//这个语句定义了一个空的map对象,其中string类型的为索引,int类型的为其值。
对于自定义类型作为键类型,特别要注意的是自定义类型必须定义<这个操作符。并且必须是严格弱排序。也即两个键比较时,不能出现相互小于的情况。
在map类型下面定义了三个类型。
map<K,V>::key_type //在map容器中,作为索引的键的类型 map<K,V>::mapped //在map容器中,键所关联的值的类型 map<K,V>::value_type //他是个pair类型
我们需要注意的是map的迭代器类型解引用将产生一个pair类型的对象
如
map<K,V>::iterator map_it = mapobj.begin(); map_it->second;//这个便是访问pair类型的第二个值
给map中添加元素,有两种方法。
第一:
用下标访问元素时,如果map中已经存在了这个索引,则不做任何操作,但是如果索引中没有这个下标时,会将这个下标添加到索引中,并且将索引的值默认进行初始化。
1 mapobj["gaoteng"];
假如map中没有"gaoteng"这个索引的话,会将"gaoteng"加入到map中,同时将“gaoteng”所指示的值初始化。
需要强调的是:下标操作返回的是map<K,V>::mapped_type,而迭代器返回的是pair对象,这个特性与顺序容器不同。
第二:
用map对象的成员insert()函数来插入。
用这个函数特别要注意的是他的返回值类型。
在形参中是pair类型的insert版本,将返回一个值,这个值是pair对象,他包含一个指向插入元素的迭代器和一个bool类型的表示是否插入的变量。
如:
pari<map<K,V>::iterator,bool> ret = mapobj.insert(make_pair(k,v));
最后提供两个检查map元素的方法:
m.count(k) //统计m中k出现的次数 m.find(k)//返回指向k索引的迭代器,如果没找到,返回超出末端的迭代器
从map中删除对象
与顺序容器不同的是,erase()成员函数返回void,而顺序容器则返回一个指向被删除元素的后一个迭代器。
与顺序容器一样,也可以通过 m.begin()与m.end()获取迭代器然后进行遍历,只不过遍历方式是按索引的升序排列的。
map映照容器的元素数据是一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系。
map映照容器的数据结构是采用红黑树来实现的,插入键值的元素不允许重复,比较函数只对元素的键值进行比较,元素的各项数据可通过键值检索出来。
使用map容器需要头文件包含语句“#include<map>”, map文件也包含了对multimap多重映照容器的定义。
1、map创建、元素插入和遍历访问
创建map对象,键值与映照数据的类型由自己定义。在没有指定比较函数时,元素的插入位置是按键值由小到大插入到黑白树中去的,下面这个程序详细说明了如何操作map容器。