首页 > 编程语言 >C++数据结构map中的begin()和rbegin()具体区别及erase()具体用法

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

时间:2023-01-03 16:12:56浏览次数:41  
标签:map begin 迭代 testmap C++ 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上使用发现略有不同。

标签:map,begin,迭代,testmap,C++,rbegin,erase
From: https://www.cnblogs.com/echoqiqi/p/17022536.html

相关文章

  • 【学习笔记】ResultMap 结果集映射
    ResultMap结果集映射背景:我们在写sql配置文件时,以select标签为例,resultType属性绑定的是实体类<selectid="getUsers"resultType="user"> select*fromjdbcstu......
  • C++ nullptr
    nullptr表示指针,它的类型是std::nullptr_t(nullptr有类型!NULL没有类型),它是prvalue可以看到nullptr经编译器生成的汇编代码会直接变为0,所以nullptr是一个有类型的常量0(......
  • echarts实现世界地图,解决series-map和geo同时使用导致在地图上缩放图层会重叠的问题
    主要使用到的配置:geoIndex//将坐标与值对应并反映在地图上convertData(data){varres=[];varthat=thisfor(vari=0;i<data.length;i++)......
  • AtCoder Beginner Contest 129
    AtCoderBeginnerContest129https://atcoder.jp/contests/abc1294/6:ABCDA-Airplane水题:#include<bits/stdc++.h>usingnamespacestd;intmain(){i......
  • C/C++ 开发总结 -- 【持续更新】
    此文章将记录我在C/C++开发过程中遇到的问题及相关知识技术点,方便自己以后查阅.....博客列表​​C++中vector结合迭代器实现增删操作!​​删除vector里面多个符合条件的......
  • c++多线程参数传递学习程序及随笔注释
    `#includeincludevoidf(inti,conststd::string&s){}voidoops(intsome_para){charbuffer[1024];sprintf(buffer,"%i",some_para);//!std::threadt(f......
  • 分析.foreach和.map的区别
    在程序员编程的过程中经常会有遍历数组的需要,.foreach和.map都具有遍历的作用,那么他们的共同点和区别是什么呢?我们来分析一下.一、共同点1.都只能遍历数组。2.每次......
  • c++文件基本操作
    c++:文件操作全解文本文件操作读文件类别作用ios::in打开一个文件用于读取ios::out打开一个文件用于写入ios::binary用二进制打开一个文件ios::app......
  • C++/python共享内存交换图片/文本信息
    共享内存保存读取图片OpenShare.cpp#include"OpenShare.h"//共享内存1,,C++发--python传递位姿与图像存储路径intkey_id=1111;intshmid;void*pBuffer;//共......
  • Java Map实现按value排序
    JavaMap实现按value排序如果想按照key来排序,用TreeMap就可以;如果想实现按value排序,可以采用下面这种方式publicstaticvoidmain(String[]args){Map<St......