C++ map 学习笔记
作者:@cherish.
课程学习内容为作者从学校的PPT处摘抄,仅供自己学习参考,若需转载请注明出处:https://www.cnblogs.com/cherish-/p/16148101.html
std::map
以下内容大多来自此处,并将其中内容做了简化,想详细了解的可点击该链接进行了解和学习。
定义于头文件<map>
std::map
是有序键值对容器,它的元素的键是唯一的。用比较函数 Compare
排序键。搜索、移除和插入操作拥有对数复杂度。 map
通常实现为红黑树。在每个标准库使用比较 (Compare
) 概念的位置,以等价关系检验唯一性。不精确而言,若二个对象a
与 b
互相比较不小于对方 :!comp(a, b) && !comp(b, a)
,则认为它们等价(非唯一)。所以对于自定义类型,只需要重载小于运算符就可以使用std::map
容器。
声明方式:
std::map<int , int>mp;//声明一个由int到int的map映射
std::map<long long, vector<int>>mp;//声明一个由long long到vector<int>的映射
std::map<int , map<int , int>>mp;//map嵌套
//声明一般来讲对于值没有要求,但对于键需要重载比较运算符,根据前述,对于自定义类,重载小于运算符即可
元素访问
-
at()
返回到拥有等于
key
的关键的元素被映射值的引用。若无这种元素,则抛出std::out_of_range
类型异常。复杂度:,为容器的大小。
-
operator []
若不存在拥有关键
key
的元素,则为到新元素被映射值的引用。否则为到既存的关键等价于 key 的元素的被映射值的引用。也即当访问一个键key
时,若std::map
中存在该元素,就返回其值的引用;若不存在该元素,则先插入该键key
,对应的值为默认值。故向std::map
中插入元素可以这样实现:std::map<int , float>mp; mp[1] = 1.1;//插入了键值对(1 , 1.1) mp[1] = 2.1;//将上述的键1的值由1.1修改为2.1
复杂度:,为容器大小
上述方法也可以用于判断
std::map
中是否含有某元素(即map[key] == initVal
)但这样在不存在这个元素时会使得std::map::size
的值增加一,在实际使用中若需要使用到std::map::size
时容易出错。
迭代器
因为std::map
是有序容器,所以使用迭代器访问得到的键值对是按照键值排序的。他的所有迭代器同vector
,使用方法也相同,不再赘述。
容量
名称和含义都与vector
的类似
-
empty()
若容器为空则为
true
,否则为false
-
size()
容器中的元素数量。
-
max_size()
元素数量的最大值。此值通常反映容器大小上的理论极限。
其他函数
-
clear()
从容器擦除所有元素。此调用后
size()
返回零。复杂度:,为
map
中的元素数量。 -
insert()
有很多重载,可以参考此页面了解和学习。
-
insert_or_assign()
C++17
的函数,可以参考此页面了解和学习。简单来说其功能为:插入元素,或若键已存在则赋值给当前元素。 -
try_emplace()
C++17
的函数,可以参考此页面了解和学习。简单来说其功能为:若键不存在则原位插入,若键存在则不做任何事。 -
erase()
可以参考此页面了解和学习。简单来说其功能为:从
map
中擦除元素。 -
swap()
将内容与
other
的交换。不在单独的元素上调用任何移动、复制或交换操作。复杂度:。
-
merge()
C++17
的函数,可以参考此页面了解和学习。简单来说其功能为:从另一容器接合结点。复杂度:,为一个
map
中的结点数量。 -
count()
返回拥有关键比较等价于指定参数的元素数,因为此容器不允许重复故为 1 或 0。该方法不会向
map
中插入一个键值对,所以在需要判断一个map
里面是否含有键key
时可以使用该方法。复杂度:,为
map
中的元素数量 -
find()
寻找键等于
key
的元素。若存在返回对应的迭代器,否则返回end()
。该方法也可用于判断是否存在某个键。复杂度:,含义同上
-
contains()
C++20
函数,判断map
中是否存在键key
,返回值为bool
值。复杂度:,含义同上
-
equal_range()
返回容器中所有拥有给定关键的元素范围。范围以二个迭代器定义,一个指向首个不小于 key 的元素,另一个指向首个大于
key
的元素。首个迭代器可以换用lower_bound()
获得,而第二迭代器可换用upper_bound()
获得。 -
lower_bound()
指向首个不小于
key
的元素的迭代器。若找不到这种元素,则返回尾后迭代器end()
-
upper_bound()
指向首个大于
key
的元素的迭代器。若找不到这种元素,则返回尾后迭代器end()
作者:cherish.
出处:https://home.cnblogs.com/u/cherish-/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!