《算法笔记》学习笔记

map 常见用法详解

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

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

1. map 的定义

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

2. map 容器内元素访问

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

(1) 通过下标访问

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

(2) 通过迭代器访问

//map 迭代器的定义和其他STL容器迭代器定义的方式相同
map<typename1, typename2>::iterator it;
//typename1和typename2就是定义map填写时的类型
//map的每一对映射都有两个typename,这决定了必须能通过一个 it 来同时访问键和值。
//map 可以使用 it->first 来访问键, it->second 来访问值。
#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;
}

3. map常用函数实例解析

**(1) find() **

//find(key)返回键为key的映射的迭代器,时间复杂度为O(logN),N为map中映射的个数
#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\n", it -> first, it -> second);
return 0;
}

(2) erase()

//erase()有两种用法:删除单个元素,删除一个区间内的所有元素
//<1> 删除单个元素
//删除单个元素有两种方法:
//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;
map<char, int>::iterator it = mp.find('b');
mp.erase(it); //删除 b 2
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
printf("%c %d\n", it -> first, it -> second);
}
return 0;
} //mp.erase(key), key为欲删除的映射的键。时间复杂度为O(logN),N为map内元素的个数
#include <stdio.h>
#include <map>
using namespace std;
int main() {
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp['c'] = 3;
mp.erase('b'); //删除键为b的映射,即 b 2
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
printf("%c %d\n", it -> first, it -> second);
}
return 0;
} //<2> 删除一个区间内的所有元素
//mp.erase(first, last), 其中first为需要删除的区间的起始迭代器,
//而last则为需要删除的区间的末尾迭代器的下一个地址,也即为删除左闭右开
//的区间[first, last)。时间复杂度为O(last - first)
#include <stdio.h>
#include <map>
using namespace std;
int main() {
map<char, int> mp;
mp['a'] = 1;
mp['b'] = 2;
mp['c'] = 3;
mp<char, int>::iterator it = mp.find('b'); //令it指向键为b的映射
mp.erase(it. mp.end()); //删除it之后的所有映射,即b 2和c 3
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
printf("%c %d\n", it -> first, it -> second);
}
return 0;
}

(3) size()

//size()用来获取map中映射的对数,时间复杂度位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()); //3对映射
return 0;
}

(4) clear()

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

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. Codeforces 576D Flights for Regular Customers (图论、矩阵乘法、Bitset)

    题目链接 http://codeforces.com/contest/576/problem/D 题解 把边按\(t_i\)从小到大排序后枚举\(i\), 求出按前\((i-1)\)条边走\(t_i\ ...

  2. Elasticsearch删除数据之_delete_by_query

    es参考版本:elasticsearch:5.5 _delete_by_query会删除所有query语句匹配上的文档,用法如下: curl -X POST "localhost:9200/ ...

  3. java.util.Date和java.sql.Date的区别和相互转化 (转)

    java.util.Date和java.sql.Date的区别及应用   java.util.Date 就是在除了SQL语句的情况下面使用 java.sql.Date 是针对SQL语句使用的,它只包含 ...

  4. ubuntu下最好用的防火墙shadaarp ,带主动防御

          shada-arpfirewall-1.0alpha3.i386.rpm 所有基于rpm的x86 Linux(内核版本>=2.6.27) Mar 11 82.9 KB     sha ...

  5. <application>节点属性

    1.android:allowBackup 它表示是否允许应用程序参与备份.如果将该属性设置为false,则即使备份整个系统,也不会执行这个应用程序的备份操作,而整个系统备份能导致所有应用程序数据通过 ...

  6. C# VS预生成事件命令行 和 生成后事件命令行

    宏 说明 $(ConfigurationName) 当前项目配置的名称(例如,“Debug|Any CPU”). $(OutDir) 输出文件目录的路径,相对于项目目录.这解析为“输出目录”属性的值. ...

  7. Python-sympy科学计算与数据处理(求极限及其它功能)

    极限 其它功能

  8. kettle mogodb output详解

    以下主要来自官网文档,原文:https://wiki.pentaho.com/display/EAI/MongoDB+Output Configure Connection Tab 1 Host na ...

  9. SQL Server 新建 数据库关系图 时弹出警告提示此数据库没有有效所有者,因此无法安装数据库关系图支持对象。

    今天创建数据库关系图,发现提示此数据库没有有效所有者,因此无法安装数据库关系图支持对象.若要继续,请首先使用 数据库属性 对话框的文件页或 ALTER AUTHORIZAITION 语句将数据库所有者 ...

  10. MySQL性能的五大配置参数(内存参数)

    内存参数: 存储引擎/共享日志缓冲区,缓冲区池 innodb_buffer_pool_sizeinnodb_additional_mem_pool_sizeinnodb_log_buffer_size ...