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类型的更多相关文章

  1. Flex ActionScript版本的Map类型

    ActionScript中没有Map类型,因为Object就相当于Map了.Object的属性相当于key,值相当于value. 也就是说,没有必要有Map类型.但是,这样做,也会带来一些问题,造成不 ...

  2. zk框架中利用map类型传值来创建window,并且传值

    @Command @NotifyChange("accList") public void clear(@BindingParam("id") String a ...

  3. Hibernate执行原生SQL返回List<Map>类型结果集

    我是学java出身的,web是我主要一块: 在做项目的时候最让人别扭的就是hibernate查询大都是查询出List<T>(T指代对应实体类)类型 如果这时候我用的联合查询,那么返回都就是 ...

  4. javabean实体类对象转为Map类型对象的方法(转发)

    //将javabean实体类转为map类型,然后返回一个map类型的值 public static Map<String, Object> beanToMap(Object obj) { ...

  5. Play Framework常用标签list,set,如何遍历list、map类型数据

    最近一段时间的项目都是在Play这个框架上进行开发的,挺强大的,但不足之处也挺多的.今天分享下play中强大的标签,遍历list,map类型的数据的用法. 遍历单纯的list数据,例如:List< ...

  6. struts2学习笔记(2)---Action中訪问ServletAPI获取Map类型的Servlet元素

    源码: strust.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...

  7. map 类型

    map 是键-值对的集合.map 类型通常可理解为关联数组(associative array): 可使用键作为下标来获取一个值,正如内置数组类型一样.而关联的本质在于元素的值与某个特定的键相关联,而 ...

  8. C++map类型 之 简单介绍

    一:map的前世今生 (1)从关联容器与顺序容器说起.关联容器通过键(key)存储和读取元素.而顺序容器则通过元素在容器中的位置顺序存储和訪问元素(vector,queue,stack,list等). ...

  9. 使用MyBatis时接收值和返回值选择Map类型或者实体类型

    MyBatis作为现近JavaEE企业级项目开发中常用的持久层框架之一,以其简洁高效的ORM映射和高度的SQL的自由性被广大开发人员认可.Mybatis在接收系统传来的参数和返回的参数时主要可以有Ma ...

随机推荐

  1. outlook无法创建保存附件解决

    用outlook2003收发邮件时,当打开或另存附件时提示“无法创建和保存文件” 解决 开始-运行,输入“regedit”打开注册表,打开以下键值“HKEY_CURRENT_USER\software ...

  2. java--实现将文字生成二维码图片,并在中间附上logo,下方附上文字

    前段时间因为工作需要,要实现将一段文字或者url生成二维码,然后中间附上logo,下方正中间附上文字的功能. 上网找了几篇教程学习了下,由于没有保存借鉴的博文链接,所以就没po上参考文章的链接啦,感谢 ...

  3. TypeScript札记:初体验

    1.简介 TypeScript 是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程. TypeScript是一种 ...

  4. 清除linux缓存命令

    命令 #sync #echo 3 > /proc/sys/vm/drop_caches 查看内存情况: # more /proc/meminfo Kernels 2.6.16 and newer ...

  5. python面试题大全(二)

    转载请注明出处http://www.cnblogs.com/goodhacker/p/3387027.html 1.python中类方法.类实例方法.静态方法有何区别? 区别: 类方法和静态方法都可以 ...

  6. Eclipse魔法堂:任务管理器

    一.前言        Eclipse的任务管理器为我们提供一个方便的入口查看工程代办事宜,并定位到对应的代码行继续之前的工作. 二.使用示例        示例1: /** * @Descripti ...

  7. angular中$cacheFactory缓存的使用

    最近在学习使用angular,慢慢从jquery ui转型到用ng开发,发现了很多不同点,继续学习吧: 首先创建一个服务,以便在项目中的controller中引用,服务有几种存在形式,factory( ...

  8. [ASP.NET] 使用 ASP.NET SignalR 添加实时 Web

    ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指这样一种功能:当所连接的客户端变得可用时服务 ...

  9. 2015 Multi-University Training Contest 1 - 1002 Assignment

    Assignment Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Mean: 给你一个数列和一个k,求连续区间的极值之 ...

  10. C#中Guid类型值如何判断不是初始值!

    示例: public Guid _CurrentApplayInfoID { get; set; } 如何判断不是初始值"00000000-0000-0000-0000-0000000000 ...