栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++STL之map详解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++STL之map详解

  • 博客主页: https://blog.csdn.net/qq_50285142
  • 欢迎点赞收藏✨关注❤留言  如有错误,敬请指正
  • 虽然生活很难,但我们也要一直走下去

点击STL超全总结跳转主目录@[toc]

1️⃣map介绍1️⃣

映射类似于函数的对应关系,每个x对应一个y,而map是每个键对应一个值。会python的朋友学习后就会知道这和python的字典非常类似。

比如说:学习 对应 看书,学习 是键,看书 是值。
学习->看书
玩耍 对应 打游戏,玩耍 是键,打游戏 是值。
玩耍->打游戏

//头文件
#include
//初始化定义
map mp;
map mp;
map mp;//node是结构体类型

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

map mp;
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

map mp;
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迭代器类型

#include
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;
}

3️⃣ 添加元素3️⃣
//先声明
map mp;

方式一:

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++知识点大回顾,八篇文章让你永不破防(一)
  • 区间贡献问题习题详解
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/994580.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号