《算法笔记》学习笔记

map 常见用法详解

**map翻译为映射,也是常用的STL容器 **

map可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器)

1. map 的定义

  1. //单独定义一个map
  2. map<typename1, typename2> mp;
  3. //map和其他的STL容器在定义上有点不同
  4. //因为 map 需要确定映射前类型(键key)和映射后类型(值value)
  5. //其中第一个是键的类型,第二个是值的类型
  6. //字符串到整型的映射
  7. //必须使用string而不能用char数组
  8. map<string, int> mp;
  9. //map的键和值也可以是STL容器
  10. //将一个 set 容器映射到一个字符串
  11. map<set<int>, string> mp;

2. map 容器内元素访问

  1. //map 一般有两种访问方式:通过下标或迭代器访问

(1) 通过下标访问

  1. //和访问普通的数组是一样的
  2. //注意:map中的键是唯一的
  3. #include <stdio.h>
  4. #include <map>
  5. using namespace std;
  6. int main() {
  7. map<char, int> mp;
  8. mp['c'] = 20;
  9. mp['c'] = 30; //20被覆盖
  10. printf("%d\n", mp['c']);
  11. return 0;
  12. }

(2) 通过迭代器访问

  1. //map 迭代器的定义和其他STL容器迭代器定义的方式相同
  2. map<typename1, typename2>::iterator it;
  3. //typename1和typename2就是定义map填写时的类型
  4. //map的每一对映射都有两个typename,这决定了必须能通过一个 it 来同时访问键和值。
  5. //map 可以使用 it->first 来访问键, it->second 来访问值。
  6. #include <stdio.h>
  7. #include <map>
  8. using namespace std;
  9. int main() {
  10. map<char, int> mp;
  11. mp['m'] = 20;
  12. mp['r'] = 30;
  13. mp['a'] = 40;
  14. for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
  15. printf("%c %d\n", it -> first, it -> second);
  16. }
  17. return 0;
  18. }

3. map常用函数实例解析

**(1) find() **

  1. //find(key)返回键为key的映射的迭代器,时间复杂度为O(logN),N为map中映射的个数
  2. #include <stdio.h>
  3. #include <map>
  4. using namespace std;
  5. int main() {
  6. map<char, int> mp;
  7. mp['a'] = 1;
  8. mp['b'] = 2;
  9. mp['c'] = 3;
  10. map<char, int>::iterator it = mp.find('b');
  11. printf("%c %d\n", it -> first, it -> second);
  12. return 0;
  13. }

(2) erase()

  1. //erase()有两种用法:删除单个元素,删除一个区间内的所有元素
  2. //<1> 删除单个元素
  3. //删除单个元素有两种方法:
  4. //mp.erase(it), it为需要删除的元素的迭代器,时间复杂度为O(1)
  5. #include <stdio.h>
  6. #include <map>
  7. using namespace std;
  8. int main() {
  9. map<char, int> mp;
  10. mp['a'] = 1;
  11. mp['b'] = 2;
  12. mp['c'] = 3;
  13. map<char, int>::iterator it = mp.find('b');
  14. mp.erase(it); //删除 b 2
  15. for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
  16. printf("%c %d\n", it -> first, it -> second);
  17. }
  18. return 0;
  19. }
  20. //mp.erase(key), key为欲删除的映射的键。时间复杂度为O(logN),N为map内元素的个数
  21. #include <stdio.h>
  22. #include <map>
  23. using namespace std;
  24. int main() {
  25. map<char, int> mp;
  26. mp['a'] = 1;
  27. mp['b'] = 2;
  28. mp['c'] = 3;
  29. mp.erase('b'); //删除键为b的映射,即 b 2
  30. for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
  31. printf("%c %d\n", it -> first, it -> second);
  32. }
  33. return 0;
  34. }
  35. //<2> 删除一个区间内的所有元素
  36. //mp.erase(first, last), 其中first为需要删除的区间的起始迭代器,
  37. //而last则为需要删除的区间的末尾迭代器的下一个地址,也即为删除左闭右开
  38. //的区间[first, last)。时间复杂度为O(last - first)
  39. #include <stdio.h>
  40. #include <map>
  41. using namespace std;
  42. int main() {
  43. map<char, int> mp;
  44. mp['a'] = 1;
  45. mp['b'] = 2;
  46. mp['c'] = 3;
  47. mp<char, int>::iterator it = mp.find('b'); //令it指向键为b的映射
  48. mp.erase(it. mp.end()); //删除it之后的所有映射,即b 2和c 3
  49. for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
  50. printf("%c %d\n", it -> first, it -> second);
  51. }
  52. return 0;
  53. }

(3) size()

  1. //size()用来获取map中映射的对数,时间复杂度位O(1)
  2. #include <stdio.h>
  3. #include <map>
  4. using namespace std;
  5. int main() {
  6. map<char, int> mp;
  7. mp['a'] = 10;
  8. mp['b'] = 20;
  9. mp['c'] = 30;
  10. printf("%d\n", mp.size()); //3对映射
  11. return 0;
  12. }

(4) clear()

  1. //clear()用来清空map中的所有元素,复杂度为O(N),其中N为map中元素的个数。
  2. #include <stdio.h>
  3. #include <map>
  4. using namespace std;
  5. int main() {
  6. map<char, int> mp;
  7. mp['a'] = 1;
  8. mp['b'] = 2;
  9. mp['c'] = 3;
  10. mp.clear(); //清空map
  11. printf("%d\n", mp.size());
  12. return 0;
  13. }

4.map的常见用途

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

STL map 常见用法详解的更多相关文章

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

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

  2. STL pair 常见用法详解

    <算法笔记>学习笔记 pair 常见用法详解 //pair是一个很实用的"小玩意",当想要将两个元素绑在一起作为一个合成元素, //又不想因此定义结构体时,使用pair ...

  3. STL stack 常见用法详解

    <算法笔记>学习笔记 stack 常见用法详解 stack翻译为栈,是STL中实现的一个后进先出的容器.' 1.stack的定义 //要使用stack,应先添加头文件#include &l ...

  4. STL priority_queue 常见用法详解

    <算法笔记>学习笔记 priority_queue 常见用法详解 //priority_queue又称优先队列,其底层时用堆来实现的. //在优先队列中,队首元素一定是当前队列中优先级最高 ...

  5. STL queue 常见用法详解

    <算法笔记>学习笔记 queue 常见用法详解 queue翻译为队列,在STL中主要则是实现了一个先进先出的容器. 1. queue 的定义 //要使用queue,应先添加头文件#incl ...

  6. STL set 常见用法详解

    <算法笔记>学习笔记 set 常见用法详解 set是一个内部自动有序且不含重复元素的容器 1. set 的定义 //单独定义一个set set<typename> name: ...

  7. STL vector常见用法详解

    <算法笔记>中摘取 vector常见用法详解 1. vector的定义 vector<typename> name; //typename可以是任何基本类型,例如int, do ...

  8. STL string 常见用法详解

    string 常见用法详解 1. string 的定义 //定义string的方式跟基本数据类型相同,只需要在string后跟上变量名即可 string str; //如果要初始化,可以直接给stri ...

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

    queue的定义 queue<typename> name; queue容器内元素的访问 由于队列本身就是一种先进先出的限制性数据结构,因此在STL中只能通过front()来访问队首元素, ...

随机推荐

  1. PCIe/NVMe Soft Protocol Analyzer - 惊天发现

    最近在看一些协议方面的东西,刚刚接触很多东西不懂.为了尽快熟悉,打算搭建一套系统,包括上层主机和下层SSD. 既然是协议,那就需要硬啃spec.但是俺是懒人一个,想找个便捷方式快速熟悉.这就想到了协议 ...

  2. 用python实现的简易记牌器的demo

    实现功能很简单: 初始时 1到10 以及 jkq各 4张,大小王 共两张 只要输入相应的牌号:1到10,例如 >>1     J.K.Q :例如>>j     >> ...

  3. 6.使用Feign实现声明式REST调用

                        使用Feign实现声明式REST调用 6.1. Feign简介 Feign是一个声明式的REST客户端,它的目的就是让REST调用更加简单. Feign提供了H ...

  4. Leetcode题目279.完全平方数(动态规划-中等)

    题目描述: 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示例 1: 输入: n = 12 输出: 3 解 ...

  5. laravel 链式组合查询数据

    laravel 链式组合查询数据 一.总结 一句话总结: - 就是链式操作的基本操作,因为返回的都是一直可以进行链式操作的对象,所以我们接收返回的对象即可 - $result = DB::table( ...

  6. 深度学习之Faster-R-CNN

    哎!还是看大神博客吧 https://blog.csdn.net/liuxiaoheng1992/article/details/81843363

  7. /lib64/libstdc++.so.6: version `CXXABI_1.3.8’ not found(转载)

    原文地址:https://blog.csdn.net/EI__Nino/article/details/100086157 终极一战 绝命一击 ImportError: /lib64/libstdc+ ...

  8. 前端单元测试,以及给现有的vue项目添加jest + Vue Test Utils的配置

    文章原址:https://www.cnblogs.com/yalong/p/11714393.html 背景介绍: 以前写的公共组件,后来需要添加一些功能,添加了好几次,每次修改我都要测试好几遍保证以 ...

  9. Xib设置label自动换行和Label的顶部对齐

    真的是不想说自己了,一个Xib纠结了一天,简直了,整整被虐了一上午啊...... 不知道这是Xcode8的问题呢....还是我的Xib约束什么的问题..... 只想说的是,以前也是这么设置的,明明可以 ...

  10. 在TeamCity中执行gtest单元测试

    1. 在Visual Studio 2017中新建一个gtest项目 Sample-Test1.这个项目会自动安装“Microsoft.googletest.v140.windesktop.msvcs ...