STL map简洁教程

1 篇文章 0 订阅

最近尝试通过迭代器反向遍历map,然后就鬼畜了,发现自己map还有一些细节不太了解,所以来写篇博客。

MAP是什么?

MAP提供一对一的下标访问。

举一个简单的例子,加入你有用数组记录一些东西,个数很少,但是下标可能会非常大,比如10^15,所以我们此时使用传统数组是不合适的,我们可以轻松的通过map[10^15],来完成操作。

如何创建一个MAP?

map<int, string> mapStudent;
比如上文,创建一个以int为下标,string为内容的MAP


如何向MAP中插入元素?

在这里我们讲解一个最显而易见的写法。(若下标为1的位置已经被插入,则会覆盖)

mapStudent[1] = "one";

我们在下标为1的地方,写入字符串one。


如何查看MAP元素个数?

mapStudent.size()


如何遍历MAP?

使用迭代器。

定义一个用于正向遍历迭代器如下:

map<int, string>:: iterator iter;
定义一个用于反向遍历迭代器如下:

map<int, string>::reverse_iterator  iter;
正向进行迭代如下:

for (iter = mapStudent.begin();iter != mapStudent.end();iter++)
反向进行迭代如下:

for(iter = mapStudent.rbegin(); iter != mapStudent.rend(); iter++)

如何判断MAP内是否有某一元素?

方法一:

mapStudent[4] == "";
判断下标为4的位置是否被插入过字符串。

然而这么判断会产生一些效果
当你进行了上述代码时,如果你尝试通过mapStudent.count(4) 来判断是否插入过下标为4时,会认为你插入过。(实际上你并没插入过,是观察他是否为非空)

而如果你依旧使用同样的方法如下

mapStudent[4] == "";

则会依旧认为下标4未被插入过字符串。

所以再此建议,判断方式要统一,否则可能会出现一些难以觉察的bug


方法二:

mapStudent.count(4)
如果返回为0,则没有插入过下标为4,否则有。

count并不会产生插入伪效果,与数组下标查询不同。


方法三:

mapStudent.find(4)
寻找是否有下标为4的,若有,则返回迭代器位置,否则返回map的结束位置。

同样也不会产生伪插入效果。


如果清空一个MAP?

mapStudent.clear()

如何删除插入的某一元素?

mapStudent.earse()
传的参数为下标

用自定义类型建立一个MAP所需要注意什么?

我们需要重载<运算符,并且重载的<要注意一下几点,否则整个map都可能出现问题。因为map世界上使用平衡树实现的。

注意的内容:

1.如果a < b,则a永远都小于b(a,b的大小关系只受本身兴致影响,不受外界影响)

2.a < b && b < c -> a < c(小于关系需要有传递性)

3.a < b -> b > a


两个奇妙的函数,lower_bound(),upper_bound()

lower_bound(3) 查询到第一下标>=3的迭代器

upper_bound(3)查询到第一个下标>3的迭代器

同时这里有一个妙用,如果两个函数返回的值相同,则证明没有3这个下标。


在全文的最后,我来粗略地讲一下复杂度,插入和访问均为logN。


感觉这是我第一篇,完全没有啰嗦的c++ STL 普及文,喜欢的点个赞~

请勿转载~








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值