C++map类型 之 简介

一:map的前世今生

(1)从关联容器与顺序容器说起,关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素(vector,queue,stack,list等)。

关联容器(Associative containers)支持通过键来高效地查找和读取元素。两个基本的关联容器类型是 map 和 set。 其中map 的元素以键-值(key-value)对的形式组织:键用作元素在 map 中的索引,而值则表示所存储和读取的数据。set 仅包含一个键,并有效地支持关于某个键是否存在的查询。

(2)关联容器类型

(3)一般来说,如果希望有效地存储不同值的集合,那么使用 set 容器比较合适,而 map容器则更适用于需要存储(乃至修改)每个键所关联的值的情况在做某种文本处理时,可使用 set 保存要忽略的单词。而字典则是 map 的一种很好的应用:单词本身是键,而它的解释说明则是值。 set 和 map 类型的对象所包含的元素都具有不同的键,不允许为同一个键添加第二个元素。如果一个键必须对应多个实例,则需使用 multimap 或 multi
set,这两种类型允许多个元素拥有相同的键。

二:map简介(官方简介)

(1)map是一类关联式容器,它是模板类。关联的本质在于元素的值与某个特定的键相关联,而并非通过元素在数组中的位置类获取。它的特点是增加和删除节点对迭代器的影响很小,除了操作节点,对其他的节点都没有什么影响。对于迭代器来说,不可以修改键值,只能修改其对应的实值。

(2)map的功能

自动建立Key - value的对应。key 和 value可以是任意你需要的类型,但是需要注意的是对于key的类型,唯一的约束就是必须支持<操作符。

根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。

快速插入Key - Value 记录;快速删除记录;根据Key 修改value记录;遍历所有记录。

(3)map的定义

使用map得包含map类所在的头文件:#include <map> //注意,STL头文件没有扩展名.h

map对象是模板类,需要关键字和存储对象两个模板参数,基本的定义模式如下:

std:map<int, string> personnel;

这样就定义了一个以int为键,值为string的map对象personnel。

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类型

对迭代器进行解引用时,将获得一个引用,指向容器中一个value_type类型的值,对于map容器,其value_type是pair类型。

为了使用方便,可以对模板类进行一下类型定义,

typedef map<int, CString> UDT_MAP_INT_CSTRING;

UDT_MAP_INT_CSTRING enumMap;

三:在map中添加元素

给map中添加元素主要有两种方法:

 (1)使用下标操作符获取元素,然后给元素赋值

For example:

map<string, int> word_count; // 定义了一个空的map对象word_count;

word_count["Anna"] = 1;

程序说明:

1.在word_count中查找键为Anna的元素,没有找到.

2.将一个新的键-值对插入到word_count中,他的键是const string类型的对象,保存Anna。而他的值则采用直初始化,这就意味着在本例中指为0.

3.将这个新的键-值对插入到word_count中

4.读取新插入的元素,并将她的值赋为1.

使用下标访问map与使用下标访问数组或者vector的行为是截然不同的:使用下标访问不存在的元素将导致在map容器中添加一个新的元素,他的键即为该下标值。

(2)使用map::insert方法添加元素

map容器提供的insert操作:

1. map.insert(e) : e是一个用在map中的value_type类型的值。如果键不存在,则插入一个值为e.second的新元素;如果键在map中已经存在,那么不进行任何操作。该函数返回一个pair类型,该pair类型的first元素为当前插入e的map迭代器,pair的second类型是一个bool类型,表示是否插入了该元素。

2. map.insert(beg, end) : beg和end是迭代器,返回void类型

3. map.insert(iter, e) : e是value_type类型的值,如果e.first不在map中,则创建新元素,并以迭代器iter为起点搜索新元素存储的位置,返回一个迭代器,指向map中具有给定键的元素。

For example:

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

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

返回值:如果该键已在容器中,则其关联的值保持不变,返回的bool值为true。

(3)查找并获取map中的元素

使用下标获取元素存在一个很危险的副作用:如果该键不在map容器中,那么下标操作会插入一个具有该键的新元素。

因此引入map对象的查询操作:

map.count(k) : 返回map中键k的出现次数(对于map而言,由于一个key对应一个value,因此返回只有0和1,因此可以用此函数判断k是否在map中)

map.find(k) :  返回map中指向键k的迭代器,如果不存在键k,则返回超出末端迭代器。

For example:

int occurs = 0;

if( word_count.cout("foobar") )

occurs = word_count["foobar"];

int occurs = 0;

map<string, int>::iterator it = word_count.find("foobar");

if( it != word_count.end() )

occurs = it ->second;

(4)从map中删除元素

移除某个map中某个条目用erase()

该成员方法的定义如下:

iterator erase(iterator it); //通过一个条目对象删除

iterator erase(iterator first, iterator last);        //删除一个范围

size_type erase(const Key& key); //通过关键字删除

(5) map对象的迭代遍历

与其他容器一样,map同样提供begin和end运算,以生成用于遍历整个容器的迭代器。

时间: 2024-11-07 01:23:07

C++map类型 之 简介的相关文章

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的副

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