详解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. ES-结构化查询

    参考: https://es.xiaoleilu.com/054_Query_DSL/55_Request_body_search.html 请求体查询 GET /_search {} 分页 GET ...

  2. Filter List Views 筛选器列表视图

    In this lesson, you will learn how to filter a List View. Three techniques, based on different scena ...

  3. Socket的常用方法。

    构造方法: 1.使用构造方法 public ServerSocket(int port) 和public ServerSocket(int port,int backlog) 创建ServerSock ...

  4. Javascript获取元素的xpath

    //获取xpath function readXPath(element) { if (element.id !== "") {//判断id属性,如果这个元素有id,则显 示//* ...

  5. vue render函数解析

    一.render 函数的作用: 写一些vue.js的template太繁琐,利用render,可以使用js来生成模板,更加灵活和简便. 二.使用render前提: 官网也说了.在深入渲染函数之前推荐阅 ...

  6. 腾讯云大学 x CODING | 当 DevOps 邂逅云原生

    2019 年经济减速的阴云笼罩了所有行业,势如破竹的发展势头被打破,小微创新型企业生存艰难.越来越多的企业更加关注客户和业务之间的交付价值,精益化公司运营,降低成本,驱动业务发展.是否要拥抱云原生?开 ...

  7. django 做 migrate 时 表已存在的处理

    在开发web的时候,如果是以前已存在的项目,项目下载下来后,为了使用测试库的数据,会直接将整个测试库(如sqlite3)拿到本机来.这种情况下,如果执行的顺序不对,很容易在执行migrate的时候出现 ...

  8. [C]编译器对char数组声明的一个行为

    1概述 如果使用char[]来声明char数组,那么编译器会自动计算后面的字面量字符数,再加上一个空字符,作为它的长度.实际上这个数组最后一位被编译器强行加上了\0: #include <std ...

  9. C++如何使用宏定义来简化代码性能测试 | cpp macro like function to implement a performance profiler

    本文首发于个人博客https://kezunlin.me/post/65dc693d/,欢迎阅读最新内容! cpp macro like function to implement a perform ...

  10. 深入理解 Java 注解

    深入理解 Java 注解 本文内容基于 JDK8.注解是 JDK5 引入的,后续 JDK 版本扩展了一些内容,本文中没有明确指明版本的注解都是 JDK5 就已经支持的注解.