最近尝试通过迭代器反向遍历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<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 普及文,喜欢的点个赞~
请勿转载~