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"]=1; //插入默认的初始元素(键: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 0;
}

map::insert的使用

插入单个元素的insert版本使用键-值pair类型的参数,对于参数为一对迭代器的版本,迭代器必须指向键-值pair类型的元素

map容器的接受单个值的insert版本的返回类型

使用下标给map添加新元素,元素的值部分将采用值初始化,而插入元素的另一个方法是:直接使用insert成员,语法更紧凑:


word_count.insert(map<string,int>::value_type("Anna",1));

传递给insert的实参相当的笨拙,可以用两种方法简化:

使用make_pair


word_count.insert(make_pair("Anna",1));

或使用typedef:


typedef map<string, int>::value_type valtype;
word_count.insert(valtype("Anna", 1))

检测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,1));
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 0;
}

查找并读取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=0;
if(word_count.count("foo"))
occurs=word_count["foo"];

2、读取元素而又不插入该元素

find操作返回指向元素的迭代器,如果元素不存在,则返回end迭代器


map<string, int> word_count;
int occurs=0;
map<string,int>::iterator it=word_count.find("foo");;
if(it!=word_count.end())
occurs=it->second;

从map对象中删除元素

C++map类型,布布扣,bubuko.com

时间: 2024-11-06 14:16:27

C++map类型的相关文章

C++map类型 之 简单介绍

一:map的前世今生 (1)从关联容器与顺序容器说起.关联容器通过键(key)存储和读取元素.而顺序容器则通过元素在容器中的位置顺序存储和訪问元素(vector,queue,stack,list等). 关联容器(Associative containers)支持通过键来高效地查找和读取元素. 两个主要的关联容器类型是 map 和 set. 当中map 的元素以键-值(key-value)对的形式组织:键用作元素在 map 中的索引,而值则表示所存储和读取的数据.set 仅包括一个键.并有效地支持

cxf处理java bean及List、Map类型

项目中经常是处理复合类型比如集合List.Map,下面就cxf处理复合类型进行讲解. 具体例子如下: 这里实例是客户端传一个JavaBean,服务器端返回集合类型: 一.  接口返回List处理: 在原来的项目实例(cxf开发webService服务端口)基础上,我们先创建一个实体类User: 1 /** 2 * 3 */ 4 package com.hik.entity; 5 6 /** 7 * @ClassName: User 8 * @Description: 用户实体类 9 * @aut

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

源码: strust.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts

使用Struts2的iterator标签遍历复杂的Map类型

1.创建一个Web工程,添加Struts2支持. 2.创建两个实体类: a). Mother(母亲)的Java类. package struts.map.entity; import java.io.Serializable; public class Mother implements Serializable { private static final long serialVersionUID = 1L; private int motherId;        //母亲ID priva

javabean(实体类)转Map类型

从网上"風亦飞"的导出EXCEL的源码提取出来的,觉得很好用,分享一下给大家,主要看beanToMap方法就OK了 /*下面是从poi导出EXCEL的一部分代码,主要将传参数的list转换为map类型,list装载的数据是从数据库取出来的,可以是数组类型,也可以是map类型,也可以是实体类*/ public static TableData createTableData(List list,TableHeaderMetaData headMeta,String[] fields){

JAVA- Object与Map类型互转

发现在request中获取参数时,如果强制转成map类型会有警告提示.在网上搜到下面的代码,提供了三种解决方案. 第一种方法: 仍然会有警告提示 第二种方法: 我觉得这个方法是一个相对完整的解决办法. 该方法抛出不少异常,质量应该不错,但是没有警告提示.虽然没有精确计算,但是效率不会太高. 第三种方法: 很简洁的方法,并且没有报错提示,满足需求,决定使用该种方法. /** * 使用org.apache.commons.beanutils进行转换 */ class A { public stati

Action中访问ServletAPI获取Map类型的Servlet元素

源代码: strust.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <strut

IBatis返回map类型数据

有时侯不想创建javabean,或者污染现有的javaBean对象,就需要返回Map类型的数据对象: 1)最简单的方法就是将查询到的字段,使用""进行引起来,这样就可以返回map类型了: 2)或者写成ResultMap,来进行字段的映射也是可以的: 例子如下: <select id="queryProductInfo" parameterClass="java.util.HashMap" resultClass="java.uti

C++map类型 之 简介

一:map的前世今生 (1)从关联容器与顺序容器说起,关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素(vector,queue,stack,list等). 关联容器(Associative containers)支持通过键来高效地查找和读取元素.两个基本的关联容器类型是 map 和 set. 其中map 的元素以键-值(key-value)对的形式组织:键用作元素在 map 中的索引,而值则表示所存储和读取的数据.set 仅包含一个键,并有效地支持关