C++map类型
map是键-值对的集合,可以理解为关联数组,可以使用键作为下标来获取一个值
本文地址:http://www.cnblogs.com/archimedes/p/cpp-map.html,转载请注明源地址。
map对象的定义
使用前添加map头文件,必须分别指明键和值的类型:
map<string,int>word_count;
map的构造函数:
map<k,v>m; 创建一个名为m的空map对象,其键值类型分别为k和v
map<k,v>m(m2); 创建m2的副本m, m与m2必须有相同的键值类型
map<k,v>m(b,e); 创建map类型的对象,存储迭代器b和e标记的范围内所有元素的副本,元素的类型必须能转化为pair<const k,v>
map定义的类型
map对象的元素是键-值对,map的value_type反映了这样的事实,value_type是存储元素的键以及值的pair类型,而且键为const,比如word_count的类型为:
pair<const string, int>类型
map类定义的类型:
map<K,V>::key_type 在map容器中,用作索引的键的类型
map<K,V>::mapped_type 在map容器中,键所关联的值的类型
map<K,V>::value_type 一个pair类型,它的first元素具有const map<K,V>::key_type类型,而second元素则为map<K,V>::mapped_type类型
map迭代器进行解引用将产生pair类型的对象
map<string,int>::iterator map_it=word_count.begin();
cout<<map_it->first;
cout<<" "<<map_it->second;
map_it->first="new key" //error
++map_it->second
给map添加元素
使用insert成员实现或者先用下标操作符获取元素,然后给获取的元素赋值
使用下标访问map对象
map<string,int>woed_count; //空map
word_count["Anna"]=; //插入默认的初始元素(键:Anna, 值:1)
map的下标也使用索引(就是键)来获取该键所关联的值,如果该键已在容器中,则map的下标运算行为相同,返回该键所关联的值。只有在所查找的键不存在的时候,map容器才为该键创建一个新的元素,并将它插入到此map对象中。
1、下标操作符返回值的使用
下标操作符返回的是左值,即使特定键所关联的值
cout<<word_count["Anna"];
++word_count["Anna"];
count<<word_count["Anna"];
2、下标行为的编程意义
如果下标所表示的键在容器中不在,则添加新元素,这一特性可使程序惊人的简练:
map<string, int>word_count;
string word;
while(cin>>word)
++word_count[word];
这段程序用来记录每个单词出现的次数
编程练习:编写程序统计并输出所读入的单词出现的次数
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<utility>
using namespace std;
int main()
{
map<string, int> word_count;
string word;
while(cin>>word)
++word_count[word];
map<string, int>::iterator it;
for(it=word_count.begin(); it!=word_count.end(); it++)
cout<<it->first<<":"<<it->second<<endl;
return ;
}
map::insert的使用
插入单个元素的insert版本使用键-值pair类型的参数,对于参数为一对迭代器的版本,迭代器必须指向键-值pair类型的元素
map容器的接受单个值的insert版本的返回类型

使用下标给map添加新元素,元素的值部分将采用值初始化,而插入元素的另一个方法是:直接使用insert成员,语法更紧凑:
word_count.insert(map<string,int>::value_type("Anna",));
传递给insert的实参相当的笨拙,可以用两种方法简化:
使用make_pair
word_count.insert(make_pair("Anna",));
或使用typedef:
typedef map<string, int>::value_type valtype;
word_count.insert(valtype("Anna", ))
检测insert的返回值
如果试图插入的元素所对应的键已经在容器中,则insert将不做任何操作,但是带有一个键-值pair形参的insert版本将返回一个值:包含一个迭代器和一个bool值的pair对象,其中迭代器指向map中具有相应键的元素,而bool值则表示是否插入了该元素
下面使用insert重写的单词统计程序:
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<utility>
using namespace std;
int main()
{
map<string, int> word_count;
string word;
while(cin>>word) {
pair<map<string, int>::iterator, bool> ret=word_count.insert(make_pair(word,));
if(!ret.second)
++ret.first->second;
}
map<string, int>::iterator it;
for(it=word_count.begin(); it!=word_count.end(); it++)
cout<<it->first<<":"<<it->second<<endl;
return ;
}
查找并读取map中的元素
下标操作符读取一个值会产生副作用,map容器提供了两个操作:count和find,用于检查某个键是否存在而不会插入该键
m.count(k) 返回m中k的出现次数
m.find(k) 如果m容器中存在按k索引的元素,则返回指向该元素的迭代器。如果不存在,则返回超出末端迭代器
1、使用count检查map对象中某键是否存在
对于map对象,count成员的返回值只能是0或1,map容器只允许一个键对应一个实例,所有count可有效地表明一个键是否存在
map<string, int> word_count;
int occurs=;
if(word_count.count("foo"))
occurs=word_count["foo"];
2、读取元素而又不插入该元素
find操作返回指向元素的迭代器,如果元素不存在,则返回end迭代器
map<string, int> word_count;
int occurs=;
map<string,int>::iterator it=word_count.find("foo");;
if(it!=word_count.end())
occurs=it->second;
从map对象中删除元素

C++map类型的更多相关文章
- Flex ActionScript版本的Map类型
ActionScript中没有Map类型,因为Object就相当于Map了.Object的属性相当于key,值相当于value. 也就是说,没有必要有Map类型.但是,这样做,也会带来一些问题,造成不 ...
- zk框架中利用map类型传值来创建window,并且传值
@Command @NotifyChange("accList") public void clear(@BindingParam("id") String a ...
- Hibernate执行原生SQL返回List<Map>类型结果集
我是学java出身的,web是我主要一块: 在做项目的时候最让人别扭的就是hibernate查询大都是查询出List<T>(T指代对应实体类)类型 如果这时候我用的联合查询,那么返回都就是 ...
- javabean实体类对象转为Map类型对象的方法(转发)
//将javabean实体类转为map类型,然后返回一个map类型的值 public static Map<String, Object> beanToMap(Object obj) { ...
- Play Framework常用标签list,set,如何遍历list、map类型数据
最近一段时间的项目都是在Play这个框架上进行开发的,挺强大的,但不足之处也挺多的.今天分享下play中强大的标签,遍历list,map类型的数据的用法. 遍历单纯的list数据,例如:List< ...
- struts2学习笔记(2)---Action中訪问ServletAPI获取Map类型的Servlet元素
源码: strust.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...
- map 类型
map 是键-值对的集合.map 类型通常可理解为关联数组(associative array): 可使用键作为下标来获取一个值,正如内置数组类型一样.而关联的本质在于元素的值与某个特定的键相关联,而 ...
- C++map类型 之 简单介绍
一:map的前世今生 (1)从关联容器与顺序容器说起.关联容器通过键(key)存储和读取元素.而顺序容器则通过元素在容器中的位置顺序存储和訪问元素(vector,queue,stack,list等). ...
- 使用MyBatis时接收值和返回值选择Map类型或者实体类型
MyBatis作为现近JavaEE企业级项目开发中常用的持久层框架之一,以其简洁高效的ORM映射和高度的SQL的自由性被广大开发人员认可.Mybatis在接收系统传来的参数和返回的参数时主要可以有Ma ...
随机推荐
- 【转载】div层调整zindex属性无效原因分析及解决方法
在做的过程中,发现了一个很简单却又很多人应该碰到的问题,设置Z-INDEX属性无效.在CSS中,只能通过代码改变层级,这个属性就是z-index,要让z-index起作用有个小小前提,就是元素的pos ...
- Inkpad绘图原理浅析
本文新版本已转移到开源中国,欢迎前往指导. Inkpad是一款非常优秀的iPad矢量绘图软件,保管你一看见就忘不了.我的感觉是“一览众山小”.“相见甚晚”,以至于我写的TouchVG就是“小巫见大巫” ...
- 前端们,gulp该用起来了,简单的demo入门——gulp系列(一)
gulp.grunt前端自动化工具,只有用过才知道多么重要. 它们问世这么久了?你真的用过吗? 写个简单的less.watch任务的demo分享———— 1.准备: 安装全局node.npm,这个教程 ...
- iOS-分段控制器-基本概念
可以直接复制使用 #import "FirstViewController.h" #import "Masonry.h" @interface FirstVie ...
- 初用DataGrip,连接后看不到自己创建的数据库的问题
1.首先,成功连接数据库服务 2.可以看到默认连接到名为"larins_qr_db"的数据库 3.这时,我想看其它的数据库怎么办? 4.OK,想要的出现了!
- Cocos2dx-3.0版本 从开发环境搭建(Win32)到项目移植Android平台过程详解
作为重量级的跨平台开发的游戏引擎,Cocos2d-x在现今的手游开发领域占有重要地位.那么问题来了,作为Cocos2dx的学习者,它的可移植特性我们就需要掌握,要不然总觉得少一门技能.然而这个时候各种 ...
- 叨叨PS那些活
临睡前记得今天技术小结没写...就起来叨叨些使用Photoshop做网站的活吧. 一般网站的建站流程和人员配置是: 1 美工,创建页面的psd图 2 前端工程师,根据psd图,切出html页面 3 后 ...
- MySQL+Keepalived实现双机HA
host1与host3互为主从,即host1为host3的主机,同时也为host3的从机 host1 192.168.203.131 host2 192.168.203.132 host3 192 ...
- 重构第20天 提取子类(Extact SubClass)
理解:提取子类就是把基类中,不是所有子类或者只有少数子类用到的方法,提取出来,调整到子类中去. 详解:下面的代码中我们用到一个单一的类Registration,来处理学生选课信息. public cl ...
- 【C++】第1章 在VS2015中用C++编写控制台应用程序
分类:C++.VS2015 创建日期:2016-06-12 一.简介 看到不少人至今还在用VC 6.0开发工具学习C++,其实VC 6.0开发工具早就被淘汰了.这里仅介绍学习C++时推荐使用的两种开发 ...