C++修炼之路 map

来源:互联网 发布:java package类 编辑:程序博客网 时间:2024/04/29 09:35

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类型的值eperson(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为要删除的元素的迭代器,返回voidperson.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++;}

有任何不对之处,望指出以改正。。。






0 0
原创粉丝点击