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运算,以生成用于遍历整个容器的迭代器。

转载于:https://www.cnblogs.com/zsychanpin/p/6755044.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370977.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySql Socket 完成数据库的增查Demo

需求: 利用MySql数据库结合前端技术完成用户的注册(要求不使用Web服务技术),所以 Demo采用Socket技术实现Web通信. 第一部分:数据库创建 数据库采用mysql 5.7.18, 数据库名称为MyUser, 内部有一张表 user.字段有 Id,UserName,Psd,Tel 第二部分:数据库连接与Socket通信 创建控…

苹果桌面主题_看腻了手机自带的桌面主题,试试这个

在这个看脸的时代&#xff0c;颜值似乎越来越重要了。尤其是我们每天都要看到的手机桌面&#xff0c;如果它的颜值好一点&#xff0c;也许我们的心情会更好&#xff0c;所以有不少人都用手机自带的主题来美化桌面&#xff0c;但是对于喜欢个性的我们&#xff0c;手机自带的主题…

Java SE 11:推动Java向前发展

介绍 在我看来&#xff0c;这篇文章提出了Java语言应该如何发展以保持其作为首选语言的地位。 它还提供了一些我喜欢但有时&#xff08;可能永远不会&#xff09;成为Java一部分的功能&#xff0c;由于我将要解释的某些原因&#xff0c;这些功能有时我已经爱上了。 我真的很想…

Hexo使用细节及各种问题

解决markdown图片不显示(返回403 forbidden)、添加本地图片无法显示、修改文章page模板、同时部署发布同步到多个仓库站点(Github、coding、gitee 码云) 图片不显示 在使用过程中&#xff0c;会发现有的引用图片无法显示的问题。但是如果直接复制图片地址到浏览器打开的话显示…

智能小车37:异常在ARM、JAVA、硬件里的实现

几乎所有编程语言都有异常&#xff0c;可以说有程序就有异常。今天学习Arm的中断(异常)处理,联想到Java的异常,硬件中如何实现等问题&#xff0c;下面给大家分享一下。 一、Arm的中断。 1.触发异常 2.保存现场 3.cpu进入异常工作模式&#xff0c;程序指针(pc)跳入异常入口&…

c++builder提高批量动态创建panel的速度_骑行时影响速度的事项有哪些 怎样有效提高骑行速度 单车租赁信息...

撇开人的因素在自行车的组件中对车速影响最大的几项是什么?车重?自锁?轮组?传动?我的个人感受&#xff0c;从提高幅度上来讲&#xff0c;而不是重要性上来讲一、自锁起码提高你50%的速度&#xff0c;我不用自锁和别人一起走AVS25就很辛苦了&#xff0c;用了自锁&#xff0…

哈希三道题

两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意…

zemax光学设计超级学习手册_穿越十年的一个ZEMAX光学设计案例

目前超过两千人的光学与光学设计方面的微信公众号&#xff0c;欢迎您&#xff01;穿越十年的一个ZEMAX光学设计案例作者&#xff1a;窗台小绿萝CAD&#xff0c;这个词已经深入到学习、工作很多年&#xff0c;翻译过来就是Computer Aided Design&#xff0c;计算机辅助设计。随着…

php基础是什么,php基础学什么?

有不少同学想要学习 PHP&#xff0c;但又不清楚 PHP 基础学什么&#xff0c;那么这篇文章告诉你。熟悉前端开发语言学习 PHP 之前&#xff0c;首先要学习前端语言包括 HTML、CSS、JS 等。等对前端语言有个大致掌握后&#xff0c;能编写一个 web 静态页面。学习 PHP 基本语法和函…

名为 cursor_jinserted 的游标不存在_生鲜电商存在的问题及对策解析:未来生鲜电商如何发展?...

生鲜电商的特点有哪些&#xff1f;生鲜电商特点&#xff1a;1,生鲜电商具有粘性高、重复购买率高、毛利高的“三高”特性&#xff1b;2,生鲜食品需要保鲜、冷藏、冷冻&#xff1b;3,生鲜食品保质期比较短&#xff1b;保存不易、对物流配送的条件要求极高&#xff1b;4,生鲜商品…

番石榴函数和Java 8 Lambdas

我最近阅读了Brian Goetz的《 Lambda的状况》 &#xff0c;在阅读了该文章之后&#xff0c;我想尝试使用Java 8 Lambda表达式。 Brian在他的文章中继续描述了将一种方法称为“功能”接口的接口。 功能接口几乎总是用作匿名类&#xff0c;其中ActionListener是规范示例。 这些“…

关于源码,反码,补码(正数--负数)---------(-128)自己的理解

以一个字节为例 1、无符号位&#xff0c;一个字节可以存放0~255共256个数字&#xff1b;有符号位存放-128~127共256个数字&#xff1b; 2、无符号全都表示为正数&#xff1b;有符号位则首位表示正负数&#xff0c;正数首位为0&#xff0c;负数首位为1&#xff08;因此在判断一个…

英特尔x722网卡驱动_产品详情 | 从核心到边缘,英特尔加速5G网络基础设施建设...

英特尔近期宣布推出无可比拟的5G基础设施芯片产品组合&#xff0c;包括一款面向无线基站的10纳米片上系统(SoC)英特尔凌动P5900&#xff0c;和一款面向5G网络处理的结构化ASIC&#xff0c;一款针对5G网络优化、提供基于GPS的高精度网络服务同步功能的以太网适配器。此外&#x…

canvas离屏技术与放大镜实现

教程所示图片使用的是 github 仓库图片&#xff0c;网速过慢的朋友请移步>>> &#xff08;原文&#xff09;canvas 离屏技术与放大镜实现。 更多讨论或者错误提交&#xff0c;也请移步。 利用canvas除了可以实现滤镜&#xff0c;还可以利用离屏技术放大镜功能。为了方…

使用Ajax的Spring MVC REST调用

这篇文章提供了对Spring MVC Web应用程序的REST调用的简单示例。 它基于在Spring MVC上下文示例中使用Spring MVC服务静态资源和使用Ajax获取JSON 。 该代码可在GitHub的Spring-REST-With-Ajax目录中找到。 主页 我们的主页包含与执行Ajax调用的Javascript函数链接的四个按钮…

linux7系统如何配置网卡,Linux 7 配置网卡(nmcli)

操作系统版本&#xff1a;[rootcjcos01 network-scripts]# cat /etc/redhat-releaseRed Hat Enterprise Linux Server release 7.5 (Maipo)查看网卡、IP等信息&#xff1a;[rootcjcos01 ~]# ifconfigenp0s3: flags4163 mtu 1500inet 192.168.1.90 netmask 255.255.255.0 bro…

学以致用深入浅出数字信号处理 pdf_数字阵列雷达--相控阵专题讲座之三

数字阵列雷达-相控阵专题讲座之三https://www.zhihu.com/video/1218562626877583360从名词上看&#xff0c;数字阵列雷达&#xff0c;肯定是阵列雷达了&#xff0c;那么数字阵列与传统的相控阵雷达又有什么区别呢&#xff1f;传统的相控阵雷达&#xff0c;是依靠移相器、衰减器…

Ubuntu中右击出现终端

1 root用户 $sudo apt-get install nautilus-open-terminal 2重启 3ok 转载于:https://www.cnblogs.com/lanjianhappy/p/6761599.html

使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js

前言&#xff1a;前端小白一枚&#xff0c;刚注册博客&#xff0c;先发个学习过程中新碰到小问题试试水吧~ 摘要&#xff1a;最近在学习bootstrap&#xff0c;偶然碰到了一个小问题&#xff0c;bootstrap网站也没有做过多的解释&#xff0c;今天分享给大家。 问题描述&#x…

C#中的三层

三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为&#xff1a;界面层&#xff08;User Interface layer&#xff09;、业务逻辑层&#xff08;Business Logic Layer&#xff09;、数据访问层&#xff08;Data access layer&#xff09;。区分层次的…