1.前言
昨天写的LeetCode打卡题,用到了map数据结构,并且需要顺序和逆序遍历map并删除key对应value为0的这个对象。本以为begin()和rbegin()是一样的迭代器,只不过是一个指向map的第一个元素,一个指向,map的最后一个元素,但是实践出真知呀,这二者的区别在下文详细展开。
2.begin()和rbeing()定义及用法
begin():生成指向容器第一个元素的迭代器。
end():生成指向容器最后一个元素的迭代器。
rbegin():rbegin()是C++ STL中的函数。它返回一个反向迭代器,该迭代器指向Map的最后一个元素。反向迭代器以相反的顺序进行迭代,递增迭代器意味着朝着Map的开头移动。
正序遍历
#include<iostream>
#include<map>
using namespace std;
int main(){
map<char,string>testmap;
testmap['a']="c/c++";
testmap['b']="java";
testmap['c']="php";
testmap['d']="python";
testmap['e']="golang";
//使用begin()正序遍历
map<char,string>::iterator it;
for(it=testmap.begin();it!=testmap.end();it++)
cout<<it->first<<"-> "<<it->second<<endl;
return 0;
}
输出结果为:
a-> c/c++
b-> java
c-> php
d-> python
e-> golang
逆序遍历:
#include<iostream>
#include<map>
using namespace std;
int main(){
map<char,string>testmap;
testmap['a']="c/c++";
testmap['b']="java";
testmap['c']="php";
testmap['d']="python";
testmap['e']="golang";
for( iter=testmap.rbegin();iter!=testmap.rend();iter++)
cout<<iter->first<<"->"<<iter->second<<endl;
return 0;
}
结果:
e->golang
d->python
c->php
b->java
a->c/c++
3.begin()和rbegin()使用erase()函数
map的erase的重载版本之一定义如下:iterator erase(iterator _Where);它的参数是iterator而rbegin()的返回值是reverse_iterator,与所需参数不一致,也不能自动转换,因此语句不合法
但是,可以使用erase的另一个重载版本:size_type erase(const key_type& _Key);此时,语句应该写成如下的形式:m.erase(m.rbegin()->first);也就是erase()函数的参数可以是key值,但是删除与begin()的略有不同
begin()使用erase()函数时,删除之后迭代器依然指向此元素。使用it++指向下一个元素。
rbegin()使用erase()函数时,会自动指向下一个元素,因此在使用erase的时候不用执行++操作。
特指LeetCode的编译器;刚刚在我的codeblocks上使用发现略有不同。
标签:map,begin,迭代,testmap,C++,rbegin,erase From: https://www.cnblogs.com/echoqiqi/p/17022536.html