- 博客主页: https://blog.csdn.net/qq_50285142
- 欢迎点赞收藏✨关注❤留言 如有错误,敬请指正
- 虽然生活很难,但我们也要一直走下去
点击STL超全总结跳转主目录@[toc]
1️⃣map介绍1️⃣映射类似于函数的对应关系,每个x对应一个y,而map是每个键对应一个值。会python的朋友学习后就会知道这和python的字典非常类似。
比如说:学习 对应 看书,学习 是键,看书 是值。
学习->看书
玩耍 对应 打游戏,玩耍 是键,打游戏 是值。
玩耍->打游戏
//头文件 #include
map特性:map会按照键的顺序从小到大自动排序
2️⃣ 函数方法2️⃣| 代码 | 含义 |
|---|---|
| mp.find(key) | 返回键为key的映射的迭代器 O(logN) 注意:用find函数来定位数据出现位置,它返回一个迭代器。当数据存在时,返回数据所在位置的迭代器,数据不存在时,返回mp.end() |
| mp.erase(it) | 删除迭代器对应的键和值O(1) |
| mp.erase(key) | 根据映射的键删除键和值 O(logN) |
| mp.erase(first,last) | 删除左闭右开区间迭代器对应的键和值 O(last-first) |
| mp.size() | 返回映射的对数 O(1) |
| mp.clear() | 清空map中的所有元素 O(N) |
| mp.insert() | 插入元素,插入时要构造键值对 |
| mp.empty() | 如果map为空,返回true,否则返回false |
| mp.begin() | 返回指向map第一个元素的迭代器(地址) |
| mp.end() | 返回指向map尾部的迭代器(最后一个元素的下一个地址) |
| mp.rbegin() | 返回指向map最后一个元素的迭代器(地址) |
| mp.rend() | 返回指向map第一个元素的迭代器(地址) |
| mp.count(key) | 查看元素是否存在,因为map中键是唯一的,所以存在返回1,不存在返回0 |
| mp.lower_bound() | 返回一个迭代器,指向键值>= key的第一个元素 |
| mp.upper_bound() | 返回一个迭代器,指向键值> key的第一个元素 |
使用迭代器进行正反向遍历注意:
查找元素是否存在时,可以使用
1️⃣mp.find() 2️⃣ mp.count() 3️⃣ mp[key]
但是第三种情况,如果不存在对应的key时,会自动创建一个键值对(产生一个额外的键值对空间)
所以为了不增加额外的空间负担,最好使用前两种方法
⭐️ mp.begin()和mp.end()用法:
用于正向遍历map
mapmp; mp[1] = 2; mp[2] = 3; mp[3] = 4; auto it = mp.begin(); while(it != mp.end()) { cout << it->first << " " << it->second << "n"; it ++; }
结果:
1 2 2 3 3 4
⭐️ mp.rbegin()和mp.rend()
用于逆向遍历map
mapmp; mp[1] = 2; mp[2] = 3; mp[3] = 4; auto it = mp.rbegin(); while(it != mp.rend()) { cout << it->first << " " << it->second << "n"; it ++; }
结果:
3 4 2 3 1 2二分查找lower_bound() upper_bound()
map的二分查找以第一个元素(即键为准),对键进行二分查找
返回值为map迭代器类型
#include3️⃣ 添加元素3️⃣using namespace std; int main() { map m{{1, 2}, {2, 2}, {1, 2}, {8, 2}, {6, 2}};//有序 map ::iterator it1 = m.lower_bound(2); cout << it1->first << "n";//it1->first=2 map ::iterator it2 = m.upper_bound(2); cout << it2->first << "n";//it2->first=6 return 0; }
//先声明 mapmp;
方式一:
mp["学习"] = "看书"; mp["玩耍"] = "打游戏";
方式二:插入元素构造键值对
mp.insert(make_pair("vegetable","蔬菜"));
方式三:
mp.insert(pair("fruit","水果"));
方式四:
mp.insert({"hahaha","wawawa"});
4️⃣访问元素4️⃣
4.1.下标访问:(大部分情况用于访问单个元素)
mp["菜哇菜"] = "强哇强"; cout << mp["菜哇菜"] << "n";//只是简写的一个例子,程序并不完整
4.2.遍历访问:
方式一:迭代器访问
map::iterator it; for(it = mp.begin(); it != mp.end(); it++) { // 键 值 // it是结构体指针访问所以要用 -> 访问 cout << it->first << " " << it->second << "n"; //*it是结构体变量 访问要用 . 访问 //cout<<(*it).first<<" "<<(*it).second; }
方式二:智能指针访问
for(auto i : mp) cout << i.first << " " << i.second << endl;//键,值
方式三:对指定单个元素访问
map::iterator it = mp.find('a'); cout << it -> first << " " << it->second << "n";
方式四:c++17特性才具有
for(auto [x, y] : mp) cout << x << " " << y << "n"; //x,y对应键和值
还有两种映射:
multimap
键可以重复,即一个键对应多个值,如要了解,可以自行搜索。
unordered_map
不排序,只映射,速度更快,方法基本一样
如要了解,可查看相关博客
往期优质文章推荐
- STL详解,超全总结(快速入门STL)
- 李【期末复习】c++知识点大回顾,八篇文章让你永不破防(一)
- 区间贡献问题习题详解



