您的位置:首页 > 编程语言 > C语言/C++

C++修炼之路 map

2016-07-22 23:27 260 查看

1、介绍

关联容器map是键 - 值对的集合,键可以作为map的下标对值进去操作。这一操作有些像数组,所以map也可以看成关联数组。

2、定义

使用map需包含头文件
#include <map>

map的定义为
map<k, v> map_val;

其中k为键索引的类型,v为关联值得类型。

map的构造函数有三种形式
map<k, v> m;					//空map对象
map<k, v> m(m0);				//与m0类型相同的map对象m,m做为m0的副本
map<k, v> m(beg, end);			//m存放迭代器beg与end之间所有元素的副本

假设定义map类型为
map<string, int> person;			//string为一个人的身份证号,int为一个人的年龄

对于person对象,string类型的身份证号是其索引,int类型为其年龄值。
需要注意的是map的键k是不能修改的,只有值v是可修改的,就像person,其身份证号是固定的,而年龄会不断改变一样。


3.迭代器

map类定义三种常用的类型
map<k, v>::key_type					//索引键的类型
map<k, v>::mapped_type					//键所关联的值类型
map<k, v>::value_type					//pair类型,first为其键类型,second为其值类型

其中需要特别留意的是pair类型,pair类型的基本形式为
pair<T1, T2> p;
pair有俩个数据成员first、second,他们分别对应T1、T2

假设我们定义一个pair类型对象
pair<string, string> Pair_str("aaaa","bbb");
则Pair_str.first即为“aaaa”,Pair_str.second即为“bbbb”。

对迭代器进行解引用时,获得一个指向容器中一个value_type类型的值,因此map的迭代器,其迭代器进行解引用时产生一个pair类型的对象。
map<string, int>::iterator map_item = person.begin();
cout << map_item->first.c_str() << endl;
cout << map_item->second << endl;


4.map插入元素

1.使用下标

map的下标操作与数组的下标操作完全不同,map的下标操作不仅有查询功能,而且可以实现元素的插入。
person["per1"] = 10;
执行上面的语句时,如果person对象内没有键值为"per1"的元素,则会插入一条键值为"per1"的数据,其数据值为10;如果person对象内有该键值,则只执行修改操作。下标操作符的这一特性在一些问题应用得当,可以达到很好的效果。

2.insert

map的insert操作与其他容器的插入类似。map的insert有三种形式
person.insert(e);		//插入一个map<string, int>::value_type类型的值e
person(beg, end);		//beg和end是标记要复制元素范围的迭代器
person(item, e);		//插入一个元素e,以迭代器item为起点搜索新元素位置,返回新元素的迭代器
这里有一点需要特别注意的是,对于第一个插入方法,如果插入的数据对键值已经存在,则插入失败,否则插入成功,该方法返回值是一个pair类型的值,pair<map<string,int>::iterator,bool>,该类型的first是person类型map,second是插入结果,true代表插入成功,false代表插入失败。通过检测返回值,我们可以知道插入状态。


5.map删除元素

map的删除元素方法有3中形式
person.erase(k);					//删除键值为k的元素,返回删除个数
person.erase(p);					//p为要删除的元素的迭代器,返回void
person.erase(beg, end);			//迭代器beg和end标识要删除元素的范围


6.map中元素读取

map的下标操作符是一种方法,但是下标操作会对查询的键值不存在的元素执行插入操作。在很多时候我们并不希望这样的插入,所以我们需要使用其他方法。
map提供count和find俩种方法,
person.count(k);				//返回person中键值k出现的次数
person.find(k);				//返回person中键值为k的元素的迭代器,不存在则返回末端迭代器
通常我们使用count查看键值是否存在,使用find对相应键值的元素进行修改。

7.map的遍历

由于map提供begin和end操作,所以使用迭代器遍历是很方便的。
map<string, int>::iterator it = person.begin();
while (it != person.end())
{
cout << it->first.c_str() << endl;
cout << it->second << endl;
it++;
}


有任何不对之处,望指出以改正。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++