• 详解C++ STL map 容器


    详解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)多个对应值的情况。这显然不符合映射的概念。

  • 相关阅读:
    【BZOJ2287】消失之物
    【NOI2001】炮兵阵地
    【SCOI2005】互不侵犯
    【USACO2007 nov glod】玉米田
    【NOIP模拟】航班
    【NOIP模拟】闲荡
    【NOIP模拟】军队调遣
    树形地铁系统
    矩阵
    完美的集合(题解)
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11823184.html
Copyright © 2020-2023  润新知