C++ map 学习笔记
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
类型异常。复杂度:\(O(logn)\),\(n\)为容器的大小。
-
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
复杂度:\(O(logn)\),\(n\)为容器大小
上述方法也可以用于判断
std::map
中是否含有某元素(即map[key] == initVal
)但这样在不存在这个元素时会使得std::map::size
的值增加一,在实际使用中若需要使用到std::map::size
时容易出错。
迭代器
因为std::map
是有序容器,所以使用迭代器访问得到的键值对是按照键值排序的。他的所有迭代器同vector
,使用方法也相同,不再赘述。
容量
名称和含义都与vector
的类似
-
empty()
若容器为空则为
true
,否则为false
-
size()
容器中的元素数量。
-
max_size()
元素数量的最大值。此值通常反映容器大小上的理论极限。
其他函数
-
clear()
从容器擦除所有元素。此调用后
size()
返回零。复杂度:\(O(n)\),\(n\)为
map
中的元素数量。 -
insert()
有很多重载,可以参考此页面了解和学习。
-
insert_or_assign()
C++17
的函数,可以参考此页面了解和学习。简单来说其功能为:插入元素,或若键已存在则赋值给当前元素。 -
try_emplace()
C++17
的函数,可以参考此页面了解和学习。简单来说其功能为:若键不存在则原位插入,若键存在则不做任何事。 -
erase()
可以参考此页面了解和学习。简单来说其功能为:从
map
中擦除元素。 -
swap()
将内容与
other
的交换。不在单独的元素上调用任何移动、复制或交换操作。复杂度:\(O(1)\)。
-
merge()
C++17
的函数,可以参考此页面了解和学习。简单来说其功能为:从另一容器接合结点。复杂度:\(Nlog(size() + N)\),\(N\)为一个
map
中的结点数量。 -
count()
返回拥有关键比较等价于指定参数的元素数,因为此容器不允许重复故为 1 或 0。该方法不会向
map
中插入一个键值对,所以在需要判断一个map
里面是否含有键key
时可以使用该方法。复杂度:\(O(logn)\),\(n\)为
map
中的元素数量 -
find()
寻找键等于
key
的元素。若存在返回对应的迭代器,否则返回end()
。该方法也可用于判断是否存在某个键。复杂度:\(O(logn)\),含义同上
-
contains()
C++20
函数,判断map
中是否存在键key
,返回值为bool
值。复杂度:\(O(logn)\),含义同上
-
equal_range()
返回容器中所有拥有给定关键的元素范围。范围以二个迭代器定义,一个指向首个不小于 key 的元素,另一个指向首个大于
key
的元素。首个迭代器可以换用lower_bound()
获得,而第二迭代器可换用upper_bound()
获得。 -
lower_bound()
指向首个不小于
key
的元素的迭代器。若找不到这种元素,则返回尾后迭代器end()
-
upper_bound()
指向首个大于
key
的元素的迭代器。若找不到这种元素,则返回尾后迭代器end()
作者:cherish.
出处:https://home.cnblogs.com/u/cherish-/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。