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. Head First 设计模式 —— 02. 观察者 (Observer) 模式

    思考题 在我们的一个实现中,下列哪种说法正确?(多选) P42 public class WeatherDate { // 实例变量声明 public void measurementsChanged ...

  2. jupyter安装插件Nbextensions,实现代码提示功能(终极方法)

    jupyter安装插件,实现代码提示功能 第一步 pip install jupyter_contrib_nbextensions -i https://mirrors.tuna.tsinghua.e ...

  3. 如何将项目推到github上面

    1.先查看是否安装git. 2.如果没有安装git ,下载之后别忘了配置环境变量.(右击此电脑 --属性--高级系统设置--环境变量--系统变量中的path) 3.推代码 查看状态(可查可不查) gi ...

  4. 【MySQL 基础】MySQ LeetCode

    MySQL LeetCode 175. 组合两个表 题目描述 表1: Person +-------------+---------+ | 列名 | 类型 | +-------------+----- ...

  5. 关联实现下-jsonpath取值(有难度!!耗时长)

    re的使用参考:正则表达式基础及re模块:https://www.cnblogs.com/dream66/p/12953729.html import restr1 = '{"access_ ...

  6. MySQL select join on 连表查询和自连接查询

    连表查询 JOIN ON 操作 描述 inner join 只返回匹配的值 right join 会从右表中返回所有的值, 即使左表中没有匹配 left join 会从左表中返回所有的值, 即使右表中 ...

  7. 【Java】运算符(算术、赋值、比较(关系)、逻辑、条件、位运算符)

    运算符 文章目录 运算符 1. 算术运算符 2. 赋值运算符 3. 比较运算符 4. 逻辑运算符 5. 条件运算符 6. 位运算符 7. 运算符优先级 8. 运算符操作数类型说明 9.code 算术运 ...

  8. C语言------三目运算符(条件运算符)

    今天在看C语言的时候看到了下面的代码(废话少说,直接上代码): #include <stdio.h> int main() {int max(); extern int A,B,C; // ...

  9. top有用的开关控制命令

    [原创]本文为原创博文,转发请注明出处:https://www.cnblogs.com/dingbj/p/top_command.html 今天偶然用到top命令,在动态刷新的界面上输入h顺便看了下帮 ...

  10. BAPI_PO_CHANGE

    这两天用BAPI更改采购订单,遇到了一些问题,最后调试解决了.记录如下吧.要修改的是采购订单的物料号和批次,在网上看到其它人写过关于 BAPI_PO_CHANGE的用法,但是具体问题还要具体分析啊. ...