详解C++ STL map 容器

本篇随笔简单讲解一下\(C++STL\)中的\(map\)容器的使用方法和使用技巧。

map容器的概念

\(map\)的英语释义是“地图”,但\(map\)容器可和地图没什么关系。\(map\)是“映射容器”,其存储的两个变量构成了一个键值到元素的映射关系。

比如下图:

我们可以根据键值快速地找到这个映射出的数据。

\(map\)容器的内部实现是一棵红黑树(平衡树的一种),因为比较复杂而且与理解并无多大关系,所以不予介绍,有兴趣的读者可以自己查阅相关的资料。

map容器的声明

\(map\)容器存在于\(STL\)模板库#include<map>中。使用的时候需要先开这个库。

比如:

#include<map>
map<int,char> mp;

这就建立了一个从一个整型变量到一个字符型变量的映射。

map容器的用法

因为\(map\)容器和\(set\)容器都是使用红黑树作为内部结构实现的。所以其用法比较相似。但由于二者用途大有不同,所以其用途还有微妙的差别。对于初学者来讲,其更容易涉及到的应该是\(vector\)容器、\(queue\)容器等,但是对于大佬们,经常用个\(set\)、\(map\),没事再用\(bitset\)压一压状态这都是家常便饭。

如果有想学习\(set,bitset\)容器的,请参考下面两篇博客,讲的比较详细:

bitset容器详解

set容器详解

其实,\(C++STL\)容器的使用方式都是差不多的。我们完全可以举一反三地去类比。与\(bitset\)重定义了许多奇形怪状新的函数之外,其他都是大致相同的。所以笔者在此不再做幼稚的介绍,大家都是竞赛狗,应该都能自己看明白。

常规操作

如其他\(C++STL\)容器一样,\(map\)支持基本相同的基本操作:

比如清空操作,函数\(clear()\),返回容器大小\(size()\),返回首尾迭代器\(begin(),end()\)等。

插入操作

\(map\)容器的插入操作大约有两种方法,第一种是类似于数组类型,可以把键值作为数组下标对\(map\)进行直接赋值:

mp[1]='a';

当然,也可以使用\(insert()\)函数进行插入:

mp.insert(map<int,char>::value_type(5,'d'));

删除操作

可以直接用\(erase()\)函数进行删除,如:

mp.erase('b');

遍历操作

和其他容器差不多,\(map\)也是使用迭代器实现遍历的。如果我们要在遍历的时候查询键值(即前面的那个),可以用it->first来查询,那么,当然也可以用it->second查询对应值(后面那个)

查找操作

查找操作类比\(set\)的查找操作。但是\(map\)中查找的都是键值。

比如:

mp.find(1);

即查找键值为\(1\)的元素。

map和pair的关系

我们发现,\(map\)和\(C++\)内置二元组\(pair\)特别相似。那是不是\(map\)就是\(pair\)呢?(当然不是)

那么\(map\)和\(pair\)又有什么关系呢?

@JZYShruraK大佬

首先,\(map\)构建的关系是映射,也就是说,如果我们想查询一个键值,那么只会返回唯一的一个对应值。但是如果使用\(pair\)的话,不仅不支持\(O(log)\)级别的查找,也不支持知一求一,因为\(pair\)的第一维可以有很多一样的,也就是说,可能会造成一个键值对应\(n\)多个对应值的情况。这显然不符合映射的概念。

详解C++ STL map 容器的更多相关文章

  1. 详解C++ STL set 容器

    详解C++ STL set 容器 本篇随笔简单介绍一下\(C++STL\)中\(set\)容器的使用方法及常见使用技巧. set容器的概念和性质 \(set\)在英文中的意义是:集合.\(set\)容 ...

  2. 详解C++ STL priority_queue 容器

    详解C++ STL priority_queue 容器 本篇随笔简单介绍一下\(C++STL\)中\(priority_queue\)容器的使用方法和常见的使用技巧. priority_queue容器 ...

  3. 详解C++ STL multiset 容器

    详解C++ STL multiset 容器 本篇随笔简单介绍一下\(C++STL\)中\(multiset\)容器的使用方法及常见使用技巧. multiset容器的概念和性质 \(set\)在英文中的 ...

  4. C++ STL map容器值为指针时怎么释放内存

    最近在使用STL中map时,遇到了一个问题,就是当map中值为指针对象时怎么释放内存? // 站点与TCP连接映射表 (key为ip_port_stationCode, value为 clientSo ...

  5. STL --> map容器

    map容器 一.map简介 map是一类关联式容器.它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响.对于迭代器来说,可以修改实值,而不能修改key. 二.ma ...

  6. 【docker-compose】docker-compose.yml文本内容详解 + docker-compose命令详解 + docker-compose启动服务容器时区设置

    参考地址:https://blog.csdn.net/Kiloveyousmile/article/details/79830810 参考地址:https://docs.docker.com/comp ...

  7. c++ STL map容器成员函数

    map容器用于查找,设置键值和元素值,输入键值,就能得到元素值.map对象中的元素时刻都是有序的,除非无序插入的.它是用平衡树创建的.查找很快. 函数 描述,注意有r的地方都是不能用it代替的. ma ...

  8. JAVA集合详解(Collection和Map接口)

    原文地址http://blog.csdn.net/lioncode/article/details/8673391 在JAVA的util包中有两个所有集合的父接口Collection和Map,它们的父 ...

  9. MyBatis的foreach语句详解 list array map

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有 item,index,collection,open,separator,close.it ...

随机推荐

  1. python的学习大纲

    python基础部分 函数 初识函数 函数进阶 装饰器函数 迭代器和生成器 内置函数和匿名函数 递归函数 常用模块 常用模块 模块和包 面向对象 初识面向对象 面向对象进阶 网络编程 网络编程 并发编 ...

  2. socket互传对象以及IO流的顺序问题

    UserInfo.java package com.company.s6; import java.io.Serializable; public class UserInfo implements ...

  3. SQL实用技巧:如何分割字符串

    create function f_split(@c varchar(2000),@split varchar(2)) returns @t table(col varchar(20)) as beg ...

  4. 通过程序调用微信公众号发消息api返回48001

    自己的订阅号,尝试通过写程序来给用户发消息.结果呢,接口返回报错:errcode=48001,errmsg = api unauthorized hint: [ZlPULa02942276!] 去微信 ...

  5. maven多仓库配置 公司仓库和阿里仓库

    针对公司内网私服仓库,私服仓库不能访问外网,此时无法在私服仓库代理阿里的maven仓库.我们的maven就需要配置多个仓库: maven目录下的conf/settings.xml配置文件: 一.在pr ...

  6. Configuration on demand is not supported by the current version of the Android Gradle plugin since you are using Gradle version 4.6 or above. Suggestion: disable configuration on demand by setting org

    androidStudio打开cocos3.17.2Lua项目时,出现了 Configuration on demand is not supported by the current version ...

  7. [C]表达式结合规律和运算符优先级

    表达式结合规律 如果运算符具有相同的优先级(precedence)有些表达式的结合方式是从左往右,有些则是从右往左结合的(例如赋值运算符): 表达式 结合律 组合方式 a/b%c 从左往右 (a/b) ...

  8. 第一篇:C++之hello world

    1.编辑器:Microsoft Visual C++ 2010,下载安装 2.新建项目 代码: #include <iostream>#include <Windows.h>/ ...

  9. alter对话框处理:

    from selenium import webdriverd = webdriver.Firefox()d.get('file://C:\\我的代码\\selenium自动化测试\\alter.ht ...

  10. centos7编译安装Zabbix-4.2.4及设置邮件告警教程(超详细每步都有截图)

    Zabbix-4.2.4安装及配置 此安装基于centos7的LNMP环境下,如未安装LNMP还可参考本人其他随笔 第一步:上传下载 1.前往https://www.zabbix.com/downlo ...