C++数据结构map中的begin()和rbegin()具体区别及erase()具体用法

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上使用发现略有不同。

posted @ 2023-01-03 16:02  追·不逝  阅读(2722)  评论(0编辑  收藏  举报