【STL】map容器

map

作为关联式容器的一种,map容器存储的都是pair对象,也就是用pair类模板创建的键值对。其中,各个键值对的键和值可以是任意数据类型,包括C++基本数据类型、使用结构体或类自定义的类型。

默认情况下,map容器选用std::less< T >排序规则(其中T表示键的数据类型),其会根据键的大小对所有键值对做升序排序。当然,根据实际情况的需要,我们可以手动指定map容器的排序规则,既可以选用STL标准库中提供的其他排序规则(比如std::greater< T >),也可=可以自定义排序规则。

使用map容器存储的各个键值对,键的值既不能重复也不能被修改。

构造方法

map<string,int>myMap;

类似于set,可以使用这种方式创建一个空的map。此时的map中没有任何键值。

在这里插入图片描述
此外还可以进行直接初始化的创建。由于map的本质也是储存一个pair类型,因此可以直接使用pair进行初始化
在这里插入图片描述
同set一样,可以使用拷贝的方式进行构造。
在这里插入图片描述

成员方法

begin()
返回指向容器中第一个(注意,是已排好序的第一个)键值对的双向迭代器。如果map容器用const限定,则该方法返回的是const类型的双向迭代器。
end()
返回指向容器的最后一个元素(注意,是已排好序的最后一个)所在位置后一个位置的双向迭代器,通常和begin()结合使用。如果map容器用const限定,则该方法返回的是const类型的双向迭代器。
rbegin()
返回指向最后一个(注意,是已排好序的最后一个)元素的反向双向迭代器。如果map容器用const限定,则该方法返回的是const类型的反向双向迭代器。
rend()
返沪指向第一个(注意,是已排好序的第一个)元素所在位置前一个位置的反向双向迭代器。如果map容器用const限定,则该方法返回的是const类型的反向双向迭代器。
find(key)
在map容器中查找键为key的键值对,如果成功找到,则返回指向该键值对的双向迭代器;反之,则返回和end()方法一样的迭代器。另外,如果map容器用const限定,则该方法返回的是const类型的双向迭代器。
lower_bound(key)
返回一个指向当前map容器中第一个大于或等于key的键值对的双向迭代器。如果map容器用const限定,则该方法返回的是const类型的双向迭代器。
upper_bound(key)
返回一个指向当前map容器中第一个大于key的键值对的迭代器。如果map容器用const限定,则该方法返回的是const类型的双向迭代器。
empty()
若容器为空,则返回true;否则返回false
size()
返回当前map容器中存有键值对的个数
operator[]
map容器重载了[]运算符,只要知道map容器中某个键值对的键的值,就可以向获取数组中元素那样,通过键直接获取对应的值。
at(key)
找到map容器中key键对应的值,如果找不到,该函数会引发out_of_range异常。
insert()
向map容器中插入键值对
erase()
删除map容器指定位置、指定键(key)值或者指定区域内的键值对。
swap()
交换2个map容器中存储的键值对,这意味着,操作的2个键值对的类型必须相同。
clear()
清空map容器中所有的键值对,即使map容器的size()为0
emplace()
在当前map容器中的指定位置处构造新键值对。其效果和插入键值对一样,但效率更高。
count(key)
在当前map容器中,查找键为key的键值对的个数并返回。注意,由于map容器中各键值对的键的值是唯一的,因此该函数的返回值最大为1

map的迭代器访问元素的方式:
itetator->first:访问键
iterator->secondfang:访问值

元素访问

map提供了两种访问元素的方式
at()
operator()
at()
at()成员方法也需要根据指定的键,才能从容器中找到该键对应的值;不同之处在于,如果在当前容器中查找失败,该方法不会向容器中添加新的键值对,而是直接抛出out_of_range异常。
在这里插入图片描述
在这里插入图片描述
operation[]
借助重载的[]运算符才能成功获取该键对应的值;反之,若当前map容器中没有包含该指定键的键值对,则此时使用[]运算符将不再是访问容器中的元素,而变成了向该map容器中添加一个键值对。其中键是指定的键,值是’
\0‘;
在这里插入图片描述
在这里插入图片描述
比较而言,[]更容易对原始数据造成干扰,以此更推荐使用at()访问成员。

multimap(了解)

map容器的区别在于,multimap容器中可以同时存储多(≥2)各键相同的键值对。
由于multimap与map有许多相似之处,此处只考虑不同之处,而不做赘述。
成员访问
和map容器相比,multimap未提供at()成员方法,也没有重载[]运算符。这意味着,map容器中通过指定键获取指定键值对的方式,将不再适用于multimap容器。其实这很好理解,因为multimap容器中指定的键可能对应多个键值对,而不再是1个。
因此它更多用来进行统计,或使用迭代器进行访问。

undered_map

无序容器,与map有很大区别
关联式容器的底层实现采用的树存储结构,更确切地说是红黑树结构
无序容器的底层实现采用的是哈希表的存储结构

由于有不同的数据结构支撑,因此有着不同的性质。
1.无序容器内部存储的键值对是无序的,各键值对的存储位置取决于该键值对中的键
2.和关联式容器相比,无序容器擅长通过指定键查找对应的值(平均时间复杂度为O(1));但对于使用迭代器遍历容器中存储的元素,无序容器的执行效率则不如关联式容器。

除此之外,它的用法和map完全一致,因此不再一一赘述。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值