C++map类型 之 简单介绍
一:map的前世今生
(1)从关联容器与顺序容器说起。关联容器通过键(key)存储和读取元素。而顺序容器则通过元素在容器中的位置顺序存储和訪问元素(vector,queue,stack,list等)。
关联容器(Associative containers)支持通过键来高效地查找和读取元素。
两个主要的关联容器类型是 map 和 set。
当中map 的元素以键-值(key-value)对的形式组织:键用作元素在 map 中的索引,而值则表示所存储和读取的数据。set 仅包括一个键。并有效地支持关于某个键是否存在的查询。
(2)关联容器类型
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDcwMDMzNQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
标准库提供了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运算,以生成用于遍历整个容器的迭代器。
C++map类型 之 简单介绍的更多相关文章
- JavaScript对象类型之简单介绍
引言 对象是JavaScript的基本数据类型. 对象是一种复合值:将很多值(原始值或者其他对象)聚合在一起,通过名字访问这些值. 对象可以看做属性的无序集合,每个属性都是一个名/值对.属性名是字符串 ...
- map/reduce类简单介绍
在Hadoop的mapper类中,有4个主要的函数,分别是:setup,clearup,map,run.代码如下: protected void setup(Context context) thro ...
- Swift中的Result 类型的简单介绍
Swift 5引入了一个新的Result类型, 它使用枚举来处理异步函数的结果. 苹果文档对该类型的描述: A value that represents either a success or a ...
- SQLite数据库和JPA简单介绍
SQLite数据库和JPA简单介绍 一.SQLite简单使用 SQLite是遵循ACID的关系数据库管理系统,它的处理速度很快,它的设计目标是嵌入式的,只需要几百K的内存就可以了. 1.下载SQLit ...
- [freemarker篇]04.简单介绍-基本数据类型
好几天没有更新博客了,最近一顿乱七八糟的忙!今天简单更新第四章,这里只能说是简单介绍,因为权威的还是需要看Freemarker的官方中文手册! 好几天没有更新博客了,最近一顿乱七八糟的忙!今天简单更新 ...
- hive中简单介绍分区表
所介绍内容基本上是翻译官方文档,比较肤浅,如有错误,请指正! hive中创建分区表没有什么复杂的分区类型(范围分区.列表分区.hash分区.混合分区等).分区列也不是表中的一个实际的字段,而是一个或者 ...
- Java 语言中 Enum 类型的使用介绍
Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常 ...
- map 类型
map 是键-值对的集合.map 类型通常可理解为关联数组(associative array): 可使用键作为下标来获取一个值,正如内置数组类型一样.而关联的本质在于元素的值与某个特定的键相关联,而 ...
- 简单介绍Struts2
Struts2概述 Struts2虽然是Struts1的基础上发展起来的,但是实质上是以WebWork框架为核心,为传统的Struts1注入了WebWork的设计理念,统一了Struts1和WebWo ...
随机推荐
- AMD 和 CMD 的区别
AMD 规范在这里:https://github.com/amdjs/amdjs-api/wiki/AMD CMD 规范在这里:https://github.com/seajs/seajs/issue ...
- Pycharm,Python原生IDE?
老套路,安装和使用(Win7x64.JDK神马滴早已装好). 1.安装 网上下下来后就这东西 Next D盘路径 我选择.我喜欢 开装 好慢,以后用光纤 O了 桌面小图标 2.使用 以管理员身份打开软 ...
- IDEA搭建SSMM框架(详细过程)
IDEA搭建SSMM框架(详细过程) 相关环境 Intellij IDEA Ultimate Tomcat JDK MySql 5.6(win32/win64) Maven (可使用Intellij ...
- C#实现倒油算法
原题如下:12(a桶 满的 有12斤油)斤桶里 取出6斤油 有 另外有8斤(b桶)和5斤(c桶)两个空桶 让程序输出取出这6斤油的步骤 现在实现的算法可以配参数(定义有几个桶,初始有多少油,要得到多 ...
- java 压缩导出多个excel
简单介绍下我实现的功能,首先是我的excel上传,它是以blob字段存储在oracel数据库中的,我实现的是循环遍历blob字段并使用io流进行打包下载,如有需要可自行修改 使用技术有,springM ...
- Android ANR异常解决方案
1,ANR异常的解释: ANR(android not response)即应用程序无响应,在用户操作在5秒内没有响应的话就会出现ANR异常: 2,那为什么会出现ANR异常呢? Android系统中处 ...
- c语言的枚举(遍历枚举)与数据类型总结
一.枚举的概念 枚举是C语言中的一种基本数据类型,并不是构造类型,它可以用于声明一组常数.当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型. 比如,你可以用一个枚举类型的变量来表示季节, ...
- 使用 Bundle 在 Activity 之间交换数据
[toc] 使用 Bundle 在 Activity 之间交换数据 场景 当一个 Activity 启动另一个 Activity 时,常常会有一些数据需要传过去.因为两个 Activity 之间本来就 ...
- Android studio导出配置
在使用 Android Studio 时,往往会进行一些设置,比如 界面风格.字体.字体大小.快捷键.常用模板等.但是这里的设置只能用在一个版本的 Android Studio 上,如果下载了新的 A ...
- DNS单机部署以及智能dns部署
dns理论 dns的出现 网络出现的早期是使用IP地址通讯的,那时就几台主机通讯.但是随着接入网络主机的增多,这种数字标识的地址非常不便于记忆,UNIX上就出现了建立一个叫做hosts的文件(Linu ...