4. map

  • map翻译为映射,也是常用的STL容器。
  • 在定义数组时,实际上是定义了一个int型到int型的映射,或者int型到double型的映射等。
  • hashtable[max_size]不适合数据太大,导致不好设计散列函数和浪费空间。但可以选择map建立映射。

4.1 map的定义

map<typenameKey,typenameValue> mp;

map的值和键也可以是STL容器。

4.2 map容器内元素的访问

  1. 通过下标访问

    • map的值是唯一的
    #include <stdio.h>
    #include <map>
    using namespace std;
    int main(){
    map<char, int> mp;
    mp['c'] = 20;
    mp['c'] = 30;
    printf("%d\n", mp['c']);
    return 0;
    }
  2. 通过迭代器访问

    map<typenameKey,typenameValue>::iterator it;
    • map可以用it->first来访问键,it->second来访问值!
    • map会以键从小到大的顺序自动排序。(这是由于map内部是使用红黑树实现的,在建立映射的过程中会自动实现从小大到的排序功能。)
    #include <stdio.h>
    #include <map>
    using namespace std;
    int main(){
    map<char, int> mp;
    mp['m'] = 20;
    mp['r'] = 30;
    mp['a'] = 40;
    for(map<char, int>::iterator it = mp.begin();it != mp.end(); it++){
    printf("%c %d\n", it->first,it->second);
    }
    return 0;
    }

4.3 map常用函数实例解析

  1. find()

    find(key)返回键值key的映射的迭代器,时间复杂度为\(O(logN)\)

    #include <stdio.h>
    #include <map>
    using namespace std;
    int main(){
    map<char ,int> mp;
    mp['a'] = 1;
    mp['b'] = 2;
    mp['c'] = 3;
    map<char ,int>::iterator it = mp.find('b');
    printf("%c %d", it->first, it->second);
    return 0;
    }
  2. erase()

    • 删除单个元素

      • mp.erase(it),it为需要删除的元素的迭代器。时间复杂度为\(O(1)\)。
      #include <stdio.h>
      #include <map>
      using namespace std;
      int main(){
      map<char, int> mp;
      mp['a'] = 1;
      mp['b'] = 2;
      mp['c'] = 3;
      //这种删除方法,需要先根据键值查找到迭代器指针的位置。
      auto it = mp.find('b');
      mp.erase(it);
      for(auto it = mp.begin(); it != mp.end(); it++){
      printf("%c %d\n", it->first, it->second);
      }
      return 0;
      }
      • mp.erase(key),key为欲删除的映射的键。时间复杂度为\(O(logN)\)
      #include <stdio.h>
      #include <map>
      using namespace std;
      int main(){
      map<char, int> mp;
      mp['a'] = 1;
      mp['b'] = 2;
      mp['c'] = 3;
      //总体来说删除特定键值的映射关系的时间复杂度都是O(logN)
      mp.erase('b');
      for(auto it = mp.begin(); it != mp.end(); it++){
      printf("%c %d\n", it->first, it->second);
      }
      return 0;
      }
    • 删除一个区间所有元素

      mp.erase(first,last) 左开右闭!

      #include <stdio.h>
      #include <map>
      using namespace std;
      int main(){
      map<char, int> mp;
      mp['a'] = 1;
      mp['b'] = 2;
      mp['c'] = 3;
      auto it = mp.find('b');
      mp.erase(it, mp.end()); //删除b之后的所有映射
      for(auto it = mp.begin(); it != mp.end(); it++){
      printf("%c %d\n" ,it->first, it->second);
      }
      return 0;
      }
  3. size()

    \(O(1)\)

    #include <stdio.h>
    #include <map>
    using namespace std;
    int main(){
    map<char, int> mp;
    mp['a'] = 10;
    mp['b'] = 20;
    mp['c'] = 30;
    printf("%d\n",mp.size());
    return 0;
    }
  4. clear()

    \(O(N)\)

    #include <stdio.h>
    #include <map>
    using namespace std;
    int main(){
    map<char, int> mp;
    mp['a'] = 1;
    mp['b'] = 2;
    mp.clear();
    printf("%d\n", mp.size());
    return 0;
    }

4.4 map的常见用途

  • 需要建立字符或字符串与整数之间的映射关系的题目,使用map可以减少代码量。
  • 判断大整数或其他类型数据是否存在的题目
  • 字符串和字符串的映射也可能会遇到。

C++ 标准模板库(STL):map的更多相关文章

  1. C++标准模板库(STL)——map常见用法详解

    map的定义 map<typename1, typename2> mp; map需要确定映射前类型和映射后类型,所以需要在<>内填写两个类型,第一个是键的类型,第二个是值的类型 ...

  2. 标准模板库(STL)学习探究之stack

    标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string

  3. C++ 标准模板库(STL)

    C++ 标准模板库(STL)C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), ...

  4. STL学习系列之一——标准模板库STL介绍

    库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每 ...

  5. 标准模板库--STL

    标准模板库STL 1.泛型程序设计 C++ 语言的核心优势之一就是便于软件的重用 C++中有两个方面体现重用: 1.面向对象的思想:继承和多态,标准类库 2.泛型程序设计(generic progra ...

  6. 标准模板库(STL)学习探究之vector容器

    标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...

  7. C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用

    摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...

  8. 实验8 标准模板库STL

    一.实验目的与要求: 了解标准模板库STL中的容器.迭代器.函数对象和算法等基本概念. 掌握STL,并能应用STL解决实际问题. 二.实验过程: 完成实验8标准模板库STL中练习题,见:http:// ...

  9. C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用

    摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇.主要针对线性表中的链表 ST ...

  10. C++ 标准模板库STL 队列 queue 使用方法与应用介绍

    C++ 标准模板库STL 队列 queue 使用方法与应用介绍 queue queue模板类的定义在<queue>头文件中. 与stack模板类很相似,queue模板类也需要两个模板参数, ...

随机推荐

  1. [每日一题]面试官问:Async/Await 如何通过同步的方式实现异步?

    关注「松宝写代码」,精选好文,每日一题 ​时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 一.前言 2020.12.23 日刚立的 flag,每日一 ...

  2. python之logging 模块(下篇)

    四.日志处理流程(第二种日志使用方式) 上面简单配置的方法例子中我们了解到了logging.debug().logging.info().logging.warning().logging.error ...

  3. Sentry(v20.12.1) K8S 云原生架构探索,SENTRY FOR JAVASCRIPT SDK 配置详解

    系列 Sentry-Go SDK 中文实践指南 一起来刷 Sentry For Go 官方文档之 Enriching Events Snuba:Sentry 新的搜索基础设施(基于 ClickHous ...

  4. 图片质量评估论文 | 无监督SER-FIQ | CVPR2020

    文章转自:同作者微信公主号[机器学习炼丹术].欢迎交流,共同进步. 论文名称:SER-FIQ: Unsupervised Estimation of Face Image Quality Based ...

  5. 基于 MapReduce 的单词计数(Word Count)的实现

    完整代码: // 导入必要的包 import java.io.IOException; import java.util.StringTokenizer; import org.apache.hado ...

  6. MySQL全面瓦解18:自定义函数

    定义 我们之前学习了MySQL的内置函数,非常丰富,满足了我们对数据操作的大部分需求. 但是如果有一些复杂的业务逻辑在数据库层面就可以完成,无需在程序层面完成的时候,这时候就可以写成MySQL自定义函 ...

  7. 图像分割论文 | DRN膨胀残差网络 | CVPR2017

    文章转自:同作者个人微信公众号[机器学习炼丹术].欢迎交流沟通,共同进步,作者微信:cyx645016617 论文名称:'Dilated Residual Networks' 论文链接:https:/ ...

  8. [usaco2008 Oct]Pasture Walking 牧场旅行

    题目描述 n个被自然地编号为1..n奶牛(1<=n<=1000)正在同样被方便的编号为1..n的n个牧场中吃草.更加自然而方便的是,第i个奶牛就在第i个牧场中吃草. 其中的一些对牧场被总共 ...

  9. Podinfo,迷你的 Go 微服务模板

    ​项目介绍 Podinfo 是一个用 Go 制作的小型 web 应用程序,它展示了在 Kubernetes 中运行微服务的最佳实践. 它已实现的技术指标(截选自官方 README.md ): 里面每一 ...

  10. 使用 gitlab-runner 持续集成

    gitlab-runner 是 Gitlab 推出的与 Gitlab CI 配合使用的持续集成工具.当开发人员在 Gitlab 上更新代码之后,Gitlab CI 服务能够检测到代码更新,此时可以触发 ...