STLmap 学习笔记

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

MAP是什么?

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

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

如何创建一个MAP?

比如上文,创建一个以int为下标,string为内容的MAP

如何向MAP中插入元素?

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

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

如何查看MAP元素个数?

如何遍历MAP?

使用迭代器。

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

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

正向进行迭代如下:

反向进行迭代如下:

 

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

方法一:

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

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

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

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

方法二:

如果返回为0,则没有插入过下标为4,否则有。

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

方法三:

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

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

如果清空一个MAP?

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

传的参数为下标

用自定义类型建立一个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 普及文,喜欢的点个赞~

请勿转载~

 

发表评论