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++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析
- C与C++之间相互调用实例方法讲解