C++map类型 之 简单介绍

一:map的前世今生

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

关联容器(Associative containers)支持通过键来高效地查找和读取元素。

两个主要的关联容器类型是 map 和 set。

当中map 的元素以键-值(key-value)对的形式组织:键用作元素在 map 中的索引,而值则表示所存储和读取的数据。set 仅包括一个键。并有效地支持关于某个键是否存在的查询。

(2)关联容器类型

标准库提供了8个关联容器,例如以下表。

有序容器:类型map和multimap定义在头文件map中,set和multiset定义在头文件set中;无序容器:则分别定义在unordered_map 和unordered_set中。

1-- 说明:map类型通常被称为关联数组(associative array),关联数组和正常数组以“正常”数组类似,不同之处在于其下标不必是整数。

我们通过一个keyword而不是位置来查找值。与之相对。set就是keyword的简单集合。当仅仅是想知道一个值是否存在时。set是最实用的。

2-- 使用map

// 统计每一个单词输入的个数
map<string,size_t> word_count;    // string 到 size_t的空map
string word;
while(cin >> word)
	++word_count[word];        // 提取word 的计数器并将其加 1

3--使用set

map<string,size_t> word_count;      // string 到 size_t的空map
set<string> exclude = {“The”, “But”, “And”, “Or”, “An”, “A”, “Then”,
“the”, “but”, “and”, “or”, “an”, “a”, “then”};
string word;
while(cin >> word)
	// 仅仅统计不在exclude中的单词
	If(exclude.find(word) == exclude.end() )
	++word_count[word];        // 提取word 的计数器并将其加 1

4--

注意:关联容器对其keyword类型有一些限制。默认情况下,标准库使用keyword类型的< 运算符来比較两个keyword。

pair 类型

在介绍关联容器操作之前,我们须要了解名为pair的标准库类型,它定义在头文件utility中。一个pair保存两个数据成员,first 和 second

(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对象是模板类,须要keyword和存储对象两个模板參数。主要的定义模式例如以下:

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); //通过keyword删除

(5) map对象的迭代遍历

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

时间: 2024-08-09 21:53:00

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

.net ——流的类型体系简单介绍

流的类型体系 基础流 装饰器流 包装器类 帮助类 继承自基本的stream流 在基础Stream上添加的功能 数据传输 对文件流的操作变简单 基础流 Stream 对应的后备存储是文件 内存 网络资源 FileStream MemoryStream NetWorkStream IsolatedStorgaeFileStream: 继承自FileStream 感觉还是挺类Java的. 装饰器流 BufferdStream DeflateStream GZipStream CryptoStream

map/reduce类简单介绍

在Hadoop的mapper类中,有4个主要的函数,分别是:setup,clearup,map,run.代码如下: protected void setup(Context context) throws IOException, InterruptedException { // NOTHING } protected void map(KEYIN key, VALUEIN value, Context context) throws IOException, InterruptedExcep

python的列表,元组和字典简单介绍

引 入 java                                   python 存取多个值:数组或list集合 ------------------------> 列表,元组 key-value格式:    Map        ------------------------>    字典 自己学习发现,java跟python这两门面向对象语言在数据类型的定义上,很多思想都是互通的,这里不说java,简单介绍一下python的列表,元组和字典. 一.列表 List: 最通

Scheme语言--简单介绍

一年前事实上有时间看完SICP这本书,后来由于种种原因,一直没有继续再学.由于SICP中使用Scheme确实应用不多.在Java,C++的语言眼里,Scheme确实非常另类.现在MIT已经放弃了使用Scheme作为SICP的教学语言而转向python之际,我在此開始学习这本书与这门语言的学习.SICP主要使用Scheme语言来解决计算机科学中的一些问题.为了督促自己,每天都能学习.积小流而成江海,把自己的学习过程放在这里,以供自己复习. 本系列主要包含两部分Scheme语言层面的问题及SICP中

[STL系列]开篇简单介绍

开篇: 为了应付上机考,现在需要总结下关于STL的基础知识.由于以前各种代码都喜欢从头搭起,像这种现成的牛逼的STL就没怎么看,真是作死.现在来突击啦. 开始之前,简单看一段代码,功能很简单,就是要实现对一组数字的排序,以窥STL的一斑. 1 #include "iostream" 2 #include <algorithm> 3 #include <vector> 4 using namespace std; 5 6 int main() 7 { 8 vect

SQLite数据库和JPA简单介绍

SQLite数据库和JPA简单介绍 一.SQLite简单使用 SQLite是遵循ACID的关系数据库管理系统,它的处理速度很快,它的设计目标是嵌入式的,只需要几百K的内存就可以了. 1.下载SQLitehttp://www.sqlite.org/download.htmlsqlite-dll-win32-x86-201410071659.zip(294.11 KiB)sqlite-shell-win32-x86-3080600.zip解压在文件夹D:\Database\sqlite下,得到文件s

微信公告号实现原理简单介绍;

前段时间无聊玩了玩微信公告号的实现,现在简单介绍一下微信公告号的实现原理: 开发者模式: 开发者模式其实就是,使用自己的服务器,你可以选择任何一种后台web开发语言,我以java web的实现: 数据传递: 手机app微信客服端发送数据,数据先到微信服务器,然后微信服务器直 下面的json解析以JSONObject.fromObject(即JSONObject和JSONArray)的方式解析,最简单的方式,为简单案列使用的,对于复制项目,不推荐使用这种方式,建议使用gson包或者fastJSON

Java 语言中 Enum 类型的使用介绍

Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义相似.不过相比较常量类型,枚举类型可以为申明的变量提供更大的取值范围. 举个例子来说明一下,如果希望为彩虹描绘出七种颜色,你可以在 Java 程序中通过常量定义方式来实现. 清单 1. 常量定义 Public static class RainbowColor { // 红橙黄绿青蓝紫七种颜

client高性能组件化框架React简单介绍、特点、环境搭建及经常使用语法

[本文源址:http://blog.csdn.net/q1056843325/article/details/54729657 转载请加入该地址] 明天就是除夕了 预祝大家新春快乐 [ ]~( ̄▽ ̄)~* 天天饭局搞得我是身心疲惫= = 所以更新比較慢 今天想跟大家分享的就是这个大名鼎鼎的React框架 简单介绍 React是近两年非常流行的框架 流行到什么程度呢? 我看了一下Github上的数据 React达到了5w8+的star 在JavaScript中star排名第4 受欢迎程度可见一斑