c++迭代器iterator遍历map_iterator迭代器原理

c++迭代器iterator遍历map_iterator迭代器原理什么是迭代器迭代器是一种可以遍历容器元素的数据类型。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。C++更趋向于使用迭代器而不是数组下标操作,因为标准库为每一种标准容器(如vector、map和list等)定义了一种迭代器类型,而只有少数容器(如vector)支持数组下标操作访问容器元素。可以通过迭代器指向你想访问容器的元素地址,通过*x打印出元素值。这和我们所熟知的指针极其类似。C语言有指针,指针用起来十分灵活高效。C++语言有迭代器,迭代器相对于指针而言功能更为丰富。vector,是数

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

什么是迭代器(iterator)

迭代器(iterator)是一种可以遍历容器元素的数据类型。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。C++更趋向于使用迭代器而不是数组下标操作,因为标准库为每一种标准容器(如vector、map和list等)定义了一种迭代器类型,而只有少数容器(如vector)支持数组下标操作访问容器元素。可以通过迭代器指向你想访问容器的元素地址,通过*x打印出元素值。这和我们所熟知的指针极其类似。

C语言有指针,指针用起来十分灵活高效。
C++语言有迭代器,迭代器相对于指针而言功能更为丰富。

vector,是数组实现的,也就是说,只要知道数组的首地址,就能访问到后面的元素。所以,我们可以通过访问vector的迭代器来遍历vector容器元素。
List,是链表实现的,我们知道,链表的元素都存储在一段不是连续的地址空间中。我们需要通过next指针来访问下一个元素。那么,我们也可以通过访问list的迭代器来实现遍历list容器元素。

由此可见,迭代器和容器是密不可分的、紧密相连的的关系。不同的容器,它们的迭代器也是不同的,但是它们的迭代器功能是一样的。假如没有迭代器,由于vector和list容器的存储特点,你需要两种算法去实现遍历vector和list容器的功能,复杂且低效。有了迭代器,遍历容器的效率会大大提高。

迭代器(iterator)的使用

容器都有成员begin和end,其中begin成员复制返回指向第一个元素的迭代器(用*迭代器打印出元素值),而end成员返回指向容器尾元素的下一个位置的迭代器,它是一个不存在的元素位置。

所以如果你想遍历容器(vector)元素的话,一般这样写

for( it = vector.begin(); it != vector.end(); it++ )
	cout<<*it<<endl;

Jetbrains全家桶1年46,售后保障稳定

vector容器的迭代器定义

std::vector<int> ::iterator it;     //it能读写vector<int>的元素
std::vector<int>::const_iterator it;//it只能读vector<int>的元素,不可以修改vector<int>中的元素

当然,也可以逆序迭代!

 for( std::vector<int>::reverse_iterator it = v.rbegin(); it!=v.rend();it++ )
    cout<<*it<<endl;

在这里插入图片描述
std::也可以没有,因为前面应经给出来了

using namespace std;

其他容器用法类似!


下面是以vector容器为例的C++代码,仅供参考

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{ 
   
	//要使用的vector容器应该位于所有定义容器语句的最后一句,应在1而不是2 
	vector<int> c;      //1
	vector<int> vector;
	                    //2
	vector.push_back(1);//插入尾部 
	vector.push_back(9);
	vector.push_back(5); 
	
	sort(vector.begin(),vector.end());
	for( int i=0; i<vector.size(); i++ )
		cout<<"sort_result: "<<vector[i]<<endl;
	
	cout<<"头部元素为:"<<vector.front()<<endl;//头部元素 
	cout<<"尾部元素为:"<<vector.back()<<endl;//尾部元素
	cout<<"容器尺寸大小为:"<<vector.size()<<endl;//容器尺寸大小
	 
	vector.front()=11;//修改容器头部元素值 
	vector.back()= 15;//修改容器尾部元素值
	
	cout<<"修改后头部元素为:"<<vector.front()<<endl;//头部元素
	vector.pop_back();//删除尾部元素
	 
	cout<<"修改+删除后尾部元素为:"<<vector.back()<<endl;//尾部元素
	vector.push_back(16);
	
	for( int i=0; i<vector.size(); i++ )
		cout<<"用数组输出vector["<<i<<"]:"<<vector[i]<<endl;
	
	std::vector<int>::const_iterator it;
	for( it = vector.begin(); it != vector.end(); it++ )
		cout<<"用迭代器输出:"<<*it<<endl;
	
	vector.insert(vector.begin(),100);//插入开始位置 
	for( int i=0; i<vector.size(); i++ )
		cout<<"insert_result:"<<vector[i]<<endl;
	cout<<"头部元素为:"<<vector.front()<<endl;
	
	return 0;
}

运行结果

sort_result: 1
sort_result: 5
sort_result: 9
头部元素为:1
尾部元素为:9
容器尺寸大小为:3
修改后头部元素为:11
修改+删除后尾部元素为:5
用数组输出vector[0]11
用数组输出vector[1]5
用数组输出vector[2]16
用迭代器输出:11
用迭代器输出:5
用迭代器输出:16
insert_result:100
insert_result:11
insert_result:5
insert_result:16
头部元素为:100

--------------------------------
Process exited after 0.02426 seconds with return value 0
请按任意键继续. . .

不同容器的迭代器(iterator)的功能

vector  				随机访问
deque	    			随机访问
list					双向
set / multiset			双向
map / multimap			双向
stack					不支持迭代器
queue					不支持迭代器
priority_queue			不支持迭代器
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223002.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Oracle 19c 新特性概要「建议收藏」

    Oracle 19c 新特性概要「建议收藏」本文概括出一些工作中可能会用到的Oracle19c新特性,所有新增功能的说明请参考新特性官方文档《database-new-features-guide》根据官方文档分为以下几个部分应用开发 可用性 大数据和数据仓库 整体数据库 性能 RAC和网格 安全 其他一、ApplicationDevelopment1.General1)EasyConne…

    2022年5月11日
    57
  • mix的中文是什么_mix是最小的意思吗

    mix的中文是什么_mix是最小的意思吗《mixup:BEYONDEMPIRICALRISKMINIMIZATION》2017(ICLR2018),HongyiZhangetal.Mixup,MIT和FAIRQ:为什么dataaugmentation是理解为控制模型复杂度?A:准确地说,我觉得dataaugmentation既不能简单地理解为增加trainingdata,也不能简单地理解为控制模型复杂度,而是两种效果兼而有之。考虑图像识别里常用的改变aspectratio做dataaugmentation的

    2022年9月24日
    6
  • 蓝天集团董事长郎凤娥专访

    蓝天集团董事长郎凤娥专访记者 您好 很高兴您能接受我们的访问 您能谈谈咱们蓝天集团未来的业务发展是什么吗 另外 我对蓝天不是很了解 您能给我介绍一下蓝天集团的情况么 郎凤娥 好的 那我现在给您介绍一下蓝天集团 蓝天集团是从事节能环保的企业 主要以垃圾发电和节能环保等几种业务为核心 进行技术研发 装备生产 工程建设 后期运营等一体化服务 蓝天不仅是装备制造企业 还是节能环保服务的企业 蓝天集团大多数项目是能源管理的服务模式

    2025年9月30日
    4
  • 树莓派能做什么知乎_树莓派能做哪些电脑和手机都做不了的事情?

    树莓派能做什么知乎_树莓派能做哪些电脑和手机都做不了的事情?题主这个问题其实是有代表性的,有疑问的原因,主要是没找准参照物。树莓派是300元价位,同时兼具完整软件系统(Linux)与硬件交互能力的最优选择。不能拿它和手机相比的原因很多。第一,手机没有方便好用的硬件接口,就算免费送几个电机、舵机也不知道怎么和手机连。但是用树莓派搭配很少的硬件就能做出机器人来。第二,价格。很弱的手机也得大几百元。而树莓派几乎是一个消耗品,比如做一个硬件作品就需要至少占用一个树…

    2022年6月1日
    38
  • cortex-m3权威指南_core M3

    cortex-m3权威指南_core M3Cortex-M3Bit-Banding1.概述CM3的存储器系统支持所谓的“位带”(bit-band)操作。通过它,实现了对单一bit的原子操作。位带操作仅适用于一些特殊的存储器区域中。从汇编角度看:与传统方法的比较:在位带区中,每个比特都映射到别名地址区的一个字——这是个只有LSB才有效的字。支持位带操作的两个内存区的范围是:0x2000_0000-0x2…

    2022年10月13日
    5
  • qxdm使用教程_log命令

    qxdm使用教程_log命令(一)、首先保证PC机和手机串口(或并口)之间连接畅通,这个可以从QXDM工具的系统栏看出,如果是MSM6000的项目,系统栏会显示“COMX:SURF6000-ZRF6000”;如果是MSM6025的项目,系统栏会显示“COMX:SURF6025-ZRF6025”。其中X为某个串口,比如COM1,X=1等。(二)、QXDM打开后,先配置好messageview要打印的信息,具体的配置如

    2022年10月2日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号