map,在编程中称之为映射,是一种键(key)与值(value)的对应关系
例如:数组的下标到值的映射
map 翻译为映射,是STL中常用的容器。map可以将任何有序的类型(包括基本类型和string)映射到任何类型(包括基本类型、string、结构体和STL容器)。
使用 map 需要添加头文件
#include<map>
定义的格式:map<键类型,值类型> 映射名;
例如:
map<string,int> mp;
map<long long, long long> mp;
map 的初始化
//创建map
map<int, int> mp1;
//创建并初始化
map<string, int> mp2{{"abc", 1}, {"xyz", 2}, {"ijk", 3}};
//map的拷贝
map<string, int> mp3(mp2);
map 在使用的时候一定要注意:
- 自动排序:map中的元素是根据键自动排序的。比如整数或字符串,它们将按照升序排列。
- 唯一键:每个键都必须是唯一的。如果你尝试插入一个已经存在的键,插入操作将不会成功,但可以更新该键对应的值。
- 操作复杂度:map的基本操作(如查找、插入和删除)通常时间复杂度为(O(log n))。
- 引用返回:当你访问map中的元素时,如m[key],如果键不存在,map会自动创建一个新元素并插入到map中,int型默认为0,string为空串。
- 关联数组:map可以被看作是一个关联数组,你可以通过键来访问值,就像使用数组索引一样。
map 的优势
- 动态存储空间
- 插入、删除、查找的效率高
- 键与值的类型定义非常灵活
常用的场景
- 判断范围较大的整数(例如在桶排序中)或者其他类型数据(例如string)是否存在
- 需要建立字符(字符串)与整数之间的映射
- 字符串与字符串之间的映射
迭代器
迭代器的作用与指针类似,可通过引用操作(*)访问其所指向的元素内容。常用的容器(例如map,set,vector等)都可以使用一对迭代器来表示范围,即begin(指向该容器第一个元素)和end(指向该容器最后一个元素之后的位置)。
map 中迭代器的定义:
map<long long, long long>::iterator it;
基于迭代器遍历 map 容器
#include <iostream>
#include <map>
using namespace std;
map<long long, long long> mp;
int main()
{
mp.insert({{9e18, 8e15}, {1, 1}, {2, 2}});
map<long long, long long>::iterator it;
for(it = mp.begin(); it != mp.end(); it++){
cout << it->first << " " << it->second << endl;
}
return 0;
}
基于范围的 for 循环-能遍历所有STL容器
之前的学习过程中,如果想要遍历数组,需要使用for(int i = 1; i <= n; i++),而C++11标准为C++添加了一种新的for循环方式 – 基于范围(range-base)的for循环,这样在遍历数组元素时会更方便这种基于范围的for循环适用于各种类型的数组,还适用于各种STL容器比如map、list、vector等
int a[10] = {1,2,3,4,5};
for (int i : a)
{
cout << i << " ";
}
string s = "hello";
for (char c : s)
{
cout << c << " ";
}
注意:变量 i 逐一获得容器a元素的拷贝但无法改变容器的元素
auto
在C语言和C++11之前的C++语言中auto用于显式地指出变量为自动存储,由于只能将auto用于默认为自动的变量,很少有人用在C++11制定时,制定标准的人不愿引入新关键字,因为这样可能导致将该关键字用于其他目的的代码非法,考虑到auto的老用法很少使用,所以赋予了新含义在C++11当中,auto让编译器能根据初始值的类型推断变量的类型
结合基于范围的for循环就可以写成
for (auto it : a)
{
cout << it << " ";
}
定义:在C++11当中,auto让编译器能根据初始值的类型推断变量的类型
需要注意:
- 用auto声明的变量必须初始化。
- 函数形参不能被声明为auto
- auto只是占位符,不是实际的数据类型,因此不能用于类型转换或其他一些操作,如sizeof。
- 定义在一个auto序列的变量必须始终推导成同一类型。
需要注意使用auto范围遍历map容器时,it是一个解引用后的键值对对象,直接使用it.first和it.second即可,不可以使用it->first和it->second

map 基本操作操作
| 方法 | 功能 |
| mp[key] = value; | 创建key且赋值为value |
| mp.emplace(key,value) | 插入键值对key->value |
| mp.insert({{key1, value1}, {key2, value2}}) | 插入键值对key1->value1和key2->value2 |
| mp.size() | 返回map中键值对的个数 |
| mp.erase(key) | 根据键删除键值对 |
| mp.begin() | 返回指向map头部的迭代器 |
| mp.end() | 返回指向map末尾的迭代器 |
| it->first | 返回当前迭代器指向的键值对中的键 |
| it->second | 返回当前迭代器指向的键值对中的值 |
| mp.clear() | 删除所有元素 |
| mp.empty() | 判断是否为空 |
| mp.find(key) | 获得指向元素的迭代器,如果未找到返回mp.end() |
| swap(mp1, mp2) | 交换两个map中的值 |











- 最新
- 最热
查看全部