19.5 迭代器的概念和分类

news2024/11/17 17:44:38

一:迭代器基本概念:第十三章第九节

迭代器:是一个“可遍历STL容器全部或者部分元素”的对象(行为类似于指针的对象);

迭代器用来表现容器中的某一位置;迭代器紧密依赖于容器,迭代器是由容器提供的。也就是说,一般情况是容器里定义着迭代器的具体类型细节;

理解成:迭代器和容器紧密相关(绑定)

#include <vector>
#include <iostream>

using namespace std;

void func()
{
	vector<int> vi = { 100, 200, 300 };  //定义一个容器
	for (vector<int>::iterator iter = vi.begin(); iter != vi.end(); iter++)
	{
		cout << *iter << endl;  //iter:指向容器中元素,*iter:打印迭代器所指向容器中的元素内容
	}
	return;
}

int main()
{
	func();
	cout << "end" << endl;
	return 0;
}

二:迭代器的分类

迭代器是分种类的;分类的依据:是迭代器的移动特性以及在这个迭代器上能够做的操作。

迭代器,行为如指针,到处跳,表示一个位置,我们一般分类是依据其跳跃能力,每个分类是一个对应的struct定义。

<1>输出型迭代器:(Output iterator)
struct output_iterator_tag
一步一步能往前走。并且能够通过这个种类的迭代器来改写容器中的数据。

<2>输入型迭代器:(Input iterator)
struct input_iterator_tag
一次一个以向前的方向来读取元素,按照这个顺序一个一个返回元素值。

<3>前向迭代器:(Forward iterator)
struct forward_iterator_tag
因为继承自Input迭代器,因此它能以向前的方向来读取元素,并且读取时提供额外保证。

<4>双向迭代器:(Bidireactional iterator)
struct bidirectional_iterator_tag
在前向迭代器基础之上增加了反向迭代,也就是迭代位置可以回退。

<5>随机访问迭代器:(Random-access iterator)
struct random_access_iterator_tag
在双向迭代器基础上又增加了所谓的随机访问能力,也就是增减某个偏移量,能够计算距离。还支持一些关系运算等等。

这些分类(结构)都有继承关系的,大多数容器里都有一个::iterator迭代器类型;并不是所有容器里都有迭代器;比如stack、queue等容器就不提供迭代器。

#include <set>
#include <map>
#include <list>
#include <array>
#include <vector>
#include <iostream>

using namespace std;


void _display_category(random_access_iterator_tag mytag)
{
	cout << "random_access_iterator_tag" << endl;
}

void _display_category(bidirectional_iterator_tag mytag)
{
	cout << "bidirectional_iterator_tag" << endl;
}

void _display_category(forward_iterator_tag mytag)
{
	cout << "forward_iterator_tag" << endl;
}

void _display_category(input_iterator_tag mytag)
{
	cout << "input_iterator_tag" << endl;
}

void _display_category(output_iterator_tag mytag)
{
	cout << "output_iterator_tag" << endl;
}

template <typename T>
void display_category(T iter)
{
	//T的类型编译器能推导出来
	cout << "--------------begin---------------" << endl;

	//整个这个类型 iterator_traits<T>::iterator_category 叫过滤器(萃取机),用来获取T迭代器类型的种类
	typename iterator_traits<T>::iterator_category cagy;  //相当于获取迭代器种类

	_display_category(cagy);  //编译器会挑选一个最合适的参数的重载_display_category
	std::cout << "typeid(iter).name() = " << typeid(iter).name() << std::endl;
	std::cout << "---------------end----------------" << std::endl;
}

void func()
{
	//这种类型():代表会产生一个临时对象,比如类A()代表产生一个临时A类对象
	display_category(array<int, 100>::iterator());
	display_category(vector<int>::iterator());
	display_category(list<int>::iterator());
	display_category(map<int, int>::iterator());
	display_category(set<int>::iterator());
}


int main()
{
	cout << "begin" << endl;
	func();
	cout << "end" << endl;
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/70509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年天津仁爱学院专升本动画、化学工程与工艺专业介绍

2023年天津仁爱学院专升本专业课动画专业、化学工程与工艺专业介绍 &#xff08;一&#xff09;动画专业 动画专业以行业发展对应用型人才需求为导向&#xff0c;不断提高学生就业质量为目标&#xff0c;针对学生特点&#xff0c;积极拓展动画应用领域&#xff0c;设有影视后期…

JSP SSH超市管理统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP 超市管理统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发 JSP SSH超市管理统myeclipse开发…

【Leetcode每日一题】子序列宽度之和,匹配子序列的单词数,最大平均值和的分组

891. 子序列宽度之和 计算的是【贡献】。 首先观察发现&#xff0c;顺序不影响结果。然后比如1&#xff0c;作为最大元素贡献为0&#xff0c;而作为最小元素贡献为每个子序列的【最大-1】&#xff0c;一共有多少个作为最小元素的子序列&#xff0c;对答案的贡献就是-1*(个数)。…

【✨十五天搞定电工基础】正弦交流电路的分析(下)

目录 五、复杂正弦交流电路的分析&#xff08;下&#xff09; 六、功率因数的提高 七、谐振电路 1、串联谐振 2、并联谐振 八、课后习题 1、正弦量三要素&#xff0c;相位 2、RLC串联问题 3、复杂正弦交流电路问题 4、谐振问题 五、复杂正弦交流电路的分析&#x…

Metabase学习教程:权限-4

高级数据沙盒&#xff1a;限制对列的访问 了解如何使用已保存的SQL查询对表进行沙盒处理&#xff0c;并根据用户属性限制用户可以查看的列。 我们的文章行权限涵盖了沙盒&#xff08;商业版本). 我们将沙盒定义为一种根据用户身份指定用户可以访问哪些数据的方法&#xff0c;…

【TOTP】基于时间的动态密码及其工程实践

探究了常见的动态密码的实现方式及其底层原理&#xff0c;并基于java做出了工程实践。 文章目录A.来源于一个现象的好奇B.2FAC.TOTP1.什么是TOTP2.原理详解&#xff08;基于java-totp项目分析&#xff09;3.这样真的安全吗4.常见的支持TOTP的软件1.Google Authenticator2.Micro…

RCNN学习笔记-MobileNet3

更新Block(bneck倒残差结构) 1.加入SE&#xff08;自注意力模块squeeze-and-excite bottleneck&#xff09;模块。当stride1&#xff08;高和宽是不会变化的&#xff09;且inputc outputc才有shortcut连接。 相反&#xff0c;我们将它们全部替换为扩展层中通道数量的1/4。我…

功率放大器输出阻抗的影响因素有哪些原因

关于功率放大器的疑问有很多&#xff0c;前阵子有人咨询影响功率放大器输出阻抗的有哪些因素&#xff0c;今天就请安泰电子来为大家解释&#xff0c;同时再为大家科普一下功率放大器的知识。 图&#xff1a;信号源和负载的放大器的简化模型 在搞清楚影响功率放大器输出阻抗因素…

速锐得解码本田雅阁混动版整车网关CAN总线通信协议DBC控制策略

本田汽车增城工厂就在附近50多公里的地方&#xff0c;和比亚迪汽车差不多&#xff0c;无论怎么跑都得1个多小时&#xff0c;也因为近水楼台的天然优势&#xff0c;而我们也与本田安全驾驶中心有多次深度的合作。碗里的肉&#xff0c;基本上都是上过了速锐得砧板。 近&#xff0…

m基于FPGA的半带滤波器verilog设计,对比普通结构以及乘法器复用结构

目录 1.算法描述 2.仿真效果预览 3.verilog核心程序 4.完整FPGA 1.算法描述 HBF模块由半带滤波器&#xff08;HBF&#xff09;和抽取模块组成。该模块的任务是实现2倍抽取进一步降低信号采样速率。由于HBF的冲激响应h(k)除零点外其余偶数点均为零&#xff0c;所以用HBF实现…

5G+无人驾驶融合创新,赋能港口智能化发展!

导语 | 在新一轮科技革命的时代背景下&#xff0c;5G 技术和无人驾驶的创新融合&#xff0c;使得我国当前港口的智慧化建设走在了世界的前列&#xff0c;智慧港口的发展不断深入。此次&#xff0c;我们邀请到了飞步科技的联合创始人兼 CTO、腾讯云 TVP 杨政老师&#xff0c;他将…

【LeetCode】No.116. Populating Next Right Pointers in Each Node -- Java Version

题目链接&#xff1a;https://leetcode.com/problems/populating-next-right-pointers-in-each-node/description/ 1. 题目介绍&#xff08;&#xff09; You are given a perfect binary tree where all leaves are on the same level, and every parent has two children. T…

安卓APP源码和设计报告——小说阅读器

班级 姓名 学号 答辩情况 考核项满分成绩得分掌握计算机系统软硬件资源管理的原理&#xff0c;能够设计针对计算机领域复杂工程问题的解决方案&#xff0c;设计满足特定需求的软硬件系统&#xff0c;并具有对解决方案在特定约束条件下进行工程设计和开发的能力。30能够针对计…

Excel 函数大全之 INTERCEPT function 获取线性回归线的截距

描述 使用现有的 x 值和 y 值计算直线与 y 轴相交的点。截点基于通过已知 x 值和已知 y 值绘制的最佳拟合回归线。当您想要在自变量为 0(零)时确定因变量的值时,请使用 INTERCEPT 函数。例如,当您的数据点是在室温或更高温度下获取的时,您可以使用 INTERCEPT 函数预测金属…

BIGEMAP APP导入/导出文件\照片(kml\shp\cad(dxf)\txt\excel)

APP数据导入&#xff1a; 1、kml\bmv文件通过QQ、微信等发送到手机端&#xff0c;在手机端下载文件&#xff0c;然后选择其他应用打开&#xff0c;选择bigemap打开就可以了。 2、其他数据导入&#xff08;其他数据包括&#xff1a;shp、kml\kmz、CAD的dxf、txt、excel、csv等…

java通过idea进行远程调试

1&#xff0c;基于SpringBoot使用IDEA工具 在pom.xml中配置 里配置jvmArguments参数 -Xdebug -Xrunjdwp:transportdt_socket,address8008,servery,suspendn&#xff1a; <build><plugins><plugin><groupId>org.springframework.boot</groupId>…

MySQL是怎样加锁的

是不是很多人都对 MySQL 加行级锁的规则搞的迷迷糊糊&#xff0c;对记录一会加的是 next-key 锁&#xff0c;一会加是间隙锁&#xff0c;一会又是记录锁。这次就带大家浅浅地聊一下MySQL是怎样加锁的。 什么 SQL 语句会加行级锁&#xff1f; InnoDB 引擎是支持行级锁的&#…

第十二章 Golang家庭收支记账软件项目

1.项目开发流程 2.项目需求说明 模拟实现基于文本界面的《家庭记账软件》该软件能够记录家庭的收入&#xff0c;支出&#xff0c;并能够打印收支明细表 3.项目的界面 4.项目代码实现 实现基本功能&#xff08;先使用面向过程&#xff0c;后面改成面向对象&#xff09; 功能1…

【Shell 脚本速成】10、Shell 流程控制 while 循环

目录 一、while 介绍 1.1 while 语法 二、while 与 shell 运算 2.1 比较运算 2.2 逻辑运算 2.3 文件类型判断 2.4 特殊条件 三、while 与循环控制语句 3.1 sleep 语句 3.2 break 3.3 continue 四、while 嵌套其他语句 4.1 while 嵌套 if 4.2 while 嵌套 for 4.…

XSKY星晨天合-后台开发岗

一面 TCP与UDP区别UDP的优点&#xff08;实时性好&#xff0c;占用资源低&#xff0c;无需三次握手较少被黑客利用的机会&#xff09;UDP增加哪些功能可以实现更可靠、更稳定、且保证有序&#xff08;超时重传、滑动窗口流量控制、序号/确认序号&#xff0c;面试官提到了kcp&a…