C++基础语法:STL之迭代器

前言

       "打牢基础,万事不愁" .C++的基础语法的学习

引入

        C++基础:STL概述-CSDN博客  上一篇梳理了一些同STL有关的概念.同时对理解迭代器需要的类包含,内部类,链表等内容做了分析,这篇从<C++ Prime Plus> 6th Edition(以下称"本书")的P684,大标题16.4泛型编程开始,看迭代器的内容

迭代器内容概述

     "16.4.1为何使用迭代器"这一节,内容非常好,但是不看源码不好懂.内容好的原因是作者讲了迭代器的设计思路,真正是"自顶向下设计".(如果设计者能做到这样先有思路,再有概念设计,再到具体实现,必定是不差).

         "16.4.2迭代器类型"这一节有表16.3---随机访问迭代器操作,"16.4.3迭代器的层次结构"有表16.4---迭代器性能,内容比较简单,仔细看就明白了:迭代器功能<=指针功能.指针有的运算,比如p++,p--,++p,--p,p[],p+n,p-n等等,每种不同的迭代器或者有一部分,或者全有(随机访问迭代器就是全都有).他说明了迭代器的用法和指针基本一致.

        "16.4.4概念、改进和模型"这一节的内容更加抽象,讲的是迭代器在算法上的应用,举了个例子copy()函数,是以迭代器的方式实现的(本书P691第三段).还讲了另外几种迭代器,反向迭代器reverse_iterator的用法,back_insert_iterator,front_insert_iterator和inset_iterator的用法.

        这部分内容在学完以后也可以反复揣摩.

迭代器的推导

         迭代器的定义只有一句话:迭代器是广义指针.

        本书P685第三段:"迭代器使算法独立于使用的容器类型".下面举了指针遍历数组和链表的例子.

        P685倒数第二段,函数不仅独立于容器中存储的数据类型,而且独立于容器本身的数据结构.模板提供了存储在容器中的数据类型的通用表示,因此还需要遍历容器中的值的通用表示,迭代器正是这样的通用表示.

        1>迭代器的设计思想

        迭代器要实现哪些功能?本书P686,打黑点的4个段落有说,和指针基本上一致.

        容器内部遍历数据是很容易的.在设计容器属性时,包含了"物理容器",以及和物理容器相关的各项属性.不管是数组还是链表做底层,用for还是while,使用指针遍历容器内数据不难办到.那么如何采用一种让所有容器都适用的方法去遍历每个容器的数据呢?对此进行了概念设计,

        2>迭代器概念设计:

        本书P687中间以"STL遵循上面介绍的方法"开始那一段:每个容器类定义了相应的迭代器类型.每个容器类都有一个超尾标记,当迭代器递增到超越容器最后一个值后,这个值将被赋给迭代器;每个容器类都有begin()和end()方法,他们分别返回一个指向容器的第一个元素和超尾位置的迭代器.每个容器类都使用++操作,让迭代器逐步指向超尾位置,从而遍历容器类的每一个元素.

        以上是设计迭代器时对容器的要求.特别颜色的"容器类"是翻译错误,应为"迭代器类"

        解读:每个容器类定义了迭代器类型,说明迭代器是一个容器和容器相关的类,迭代器能访问容器里的数据,采用类包含容器内的数据添加进来,形成对数据的访问和修改.并且因为只和容器相关,所以他是容器的内部类.

        迭代器图示如下:

 ----说明:1.容器里的数据被迭代器类包含,获得访问或修改的权限.

               2.迭代器生成对象first,修改属性值,使指针指向数据首元素;再生成对象last,修改属性值,使指针指向超尾.超尾的意思:对于数组而言是最大元素个数,对链表而言是0(nullptr),表示指针指空.定义迭代器函数++,使属性值从头指向尾部.

                3.迭代器和容器交互, 由函数返回刚生成的对象.

        迭代器的意思是本来由容器可完成的遍历交给内部类迭代器去完成

        3>迭代器的实现

        本书P687中间段落,以"使用容器类时"开始,无需知道其迭代器如何实现的,也无需知道超尾是如何实现的,而只需知道他有迭代器,其begin()返回一个指向第一个元素的迭代器,end()返回一个指向超尾位置的迭代器即可

本着探索精神,参照黑皮书尝试了自己写个迭代器,结果不行,某些函数被禁止重新定义

=============================内容分割线====================================

以下代码不可用

///*未成功代码,原因未知,待发掘*/
//#include<iostream>
//using namespace std;
//
//template<class T>
//class Container {
//	enum { MAX = 10 };
//	int length;
//	T a[MAX];
//public:
//	Container(int len):length(len);
//	class Iterator {
//	public:
//		T* container;
//		int leng;
//		Iterator(T* outobject, int len = 0) :container(outobject), leng(len) {}
//		Iterator operator++() {
//			this->leng++;
//			return Iterator(a, leng);
//		}
//		T operator*() {
//			return container[leng];
//		}
//		bool operator!=(Iterator& it) {
//			return this->leng != it->leng;
//		}
//	};
//	Iterator begin() const { return Iterator(a, 0) };		//报错:未知重写说明符begin
//	Iterator end() const { return Iterator(a, length) };	//报错:未知重写说明符end
//};
//
//int main(void) {
//	Container<double> tmp(5);
//	for (auto it = tmp.begin(); it != tmp.end(); it++) {	//it无法初始化,找不到匹配的!=运算符,
//		cout << *it << endl;								//*非法间接寻址,<<对于class非法
//	}
//}
//

=============================内容分割线====================================

        书上的意思很明了,只要知道怎么用就行了.也就是说编译器把他固定成不能修改的模块了. 

迭代器类型和迭代器的层次结构 

        这两小节的内容比较简单.意思是容器类被分类成若干类,每个类对应的迭代器功能有差别,其中随机迭代器功能最多,完全等于指针.其他类的迭代器功能少于指针功能. 到了用的时候,查表就行了.

概念、改进和模型 

        这一节讲了几个迭代器的用法,大概看一看,到时候查

小结 

        迭代器内容的理解 

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

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

相关文章

C++继承和多态

目录 继承 继承的意义 访问限定符、继承方式 赋值兼容规则&#xff08;切片&#xff09; 子类的默认成员函数 多继承 继承is a和组合has a 多态 什么是多态 形成多态的条件 函数重载&#xff0c;隐藏&#xff0c;重写的区别 override和final 多态原理 继承 继承的…

Algorithms,最全的Python算法仓库!

学习编程、学习Python最好的方式就是练习&#xff0c;哪怕是新手&#xff0c;只要不断地敲代码输出&#xff0c;肯定会有神效。 Python的练手项目很多&#xff0c;特别是Github上&#xff0c;建议不管新手、老司机都去看看。 这里推荐给大家一个Gitthub上练习的项目&#xff…

[C++]——同步异步日志系统(5)

同步异步日志系统 一、日志消息格式化设计1.1 格式化子项类的定义和实现1.2 格式化类的定义和实现 二、日志落地类设计2.1 日志落地模块功能实现与测试2.2 日志落地模块功能功能扩展 一、日志消息格式化设计 日志格式化模块的作用&#xff1a;对日志消息进行格式化&#xff0c…

深度学习工具和资源推荐:全面指南

今天我们来聊聊深度学习的工具和资源。要学好深度学习&#xff0c;除了理论知识&#xff0c;还需要掌握一些强大的工具和找到好的资源。以下是我在学习过程中发现的一些非常有用的工具和资源&#xff0c;希望对你们有帮助。 目录 工具推荐 1. Python编程语言 2. TensorFlow…

接口测试返回参数的自动化对比!

引言 在现代软件开发过程中&#xff0c;接口测试是验证系统功能正确性和稳定性的核心环节。接口返回参数的对比不仅是确保接口功能实现的手段&#xff0c;也是测试过程中常见且重要的任务。为了提高对比的效率和准确性&#xff0c;我们可以通过自动化手段实现这一过程。本文将…

WGCLOUD登录页面支持输入验证码吗

支持的 v3.5.3版本开始&#xff0c;WGCLOUD支持在登录页面配置输入验证码&#xff0c;我们可以根据自己的场景需要&#xff0c;配置是否在登录页面显示验证码&#xff0c;如下说明 登录页面添加验证码说明 - WGCLOUD

[超级详细系列]ubuntu22.04配置深度学习环境(显卡驱动+CUDA+cuDNN+Pytorch)--[3]安装cuDNN与Pytorch

本次配置过程的三篇博文分享分别为为&#xff1a; [超级详细系列]ubuntu22.04配置深度学习环境(显卡驱动CUDAcuDNNPytorch)--[1]安装显卡驱动 [超级详细系列]ubuntu22.04配置深度学习环境(显卡驱动CUDAcuDNNPytorch)--[2]安装Anaconda与CUDA [超级详细系列]ubuntu22.04配置深…

Web学习day04

mybatis 目录 mybatis 文章目录 一、查询 1.1结果映射 1.2多条件查询 1.3模糊查询 二、XML 书写规范 三、动态SQL 四、配置文件 4.1settings标签 4.2mappers标签 4.3environments标签 五、案例 5.1数据表 5.2实现类 5.3mapper实现 5.4工具类实现 5.5XML动态…

Python应用 | 基于flask-restful+AntDesignVue实现的一套图书管理系统

本文将分享个人自主开发的一套图书管理系统&#xff0c;后端基于Python语言&#xff0c;采用flask-restful开发后端接口&#xff0c;前端采用VueAntDesignVue实现。对其他类似系统的实现&#xff0c;比如学生管理系统等也有一定的参考作用。有问题欢迎留言讨论~ 关注公众号&am…

记一下blender曲线阵列

先说一下如何正常使用这个 这一次我是用来贴瓷砖 随便创建一个mesh 然后添加一个阵列修改器&#xff0c;然后再给他添加一个curve修改器&#xff0c;使用constant offset去偏移他 这里有个小细节 我第一次创建的curve 我选取之后&#xff0c;死活无法沿着曲线阵列&#xff…

.快速幂.

按位与&#xff08;Bitwise AND&#xff09;是一种二进制运算&#xff0c;它逐位对两个数的二进制表示进行运算。对于每一位&#xff0c;只有两个相应的位都为1时&#xff0c;结果位才为1&#xff1b;否则&#xff0c;结果位为0。如&#xff1a;十进制9 & 5转化为二进制&am…

ActiveMQ-CVE-2023-46604

Apache ActiveMQ OpenWire 协议反序列化命令执行漏洞 OpenWire协议在ActiveMQ中被用于多语言客户端与服务端通信。在Apache ActvieMQ5.18.2版本以及以前&#xff0c;OpenWire协议通信过程中存在一处反序列化漏洞&#xff0c;该漏洞可以允许具有网络访问权限的远程攻击者通过操作…

opencv 中如何通过欧式距离估算实际距离(厘米)

1&#xff1a;这个方法个人测试觉得是正确的&#xff0c;误差较小&#xff0c;目前满足我当前的需求&#xff0c;如果方法不对&#xff0c;请大家评论&#xff0c;完善。 2&#xff1a;确保拍摄的参照物是垂直的&#xff0c;如果不垂直&#xff0c;就会有误差&#xff0c;不垂…

低代码商城构建专家:Mall-Cook

Mall-Cook&#xff1a;用Mall-Cook&#xff0c;让电商创新触手可及- 精选真开源&#xff0c;释放新价值。 概览 Mall-Cook是一个面向未来的商城低代码开发平台&#xff0c;它通过提供直观的可视化界面&#xff0c;让开发者和商家能够快速构建和部署跨平台的电商解决方案。这个…

微信小程序如何实现登陆和注册功能?

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

服务器提交记录有Merge branch消除

背景&#xff1a;在共同开发分支release上&#xff0c;你提交了commit&#xff0c;push到服务器上时&#xff0c;发现有人先比你push了&#xff0c;所以你得先pull&#xff0c; 后再push&#xff0c;然而pull后自动产生了一个Merge branch的一个commit&#xff0c;这个commit本…

递归解决换零钱问题--回顾总结之递归的表达能力

前面为了保持叙述的流畅, 没有做太多的引申, 把总结推迟到了后面. 补上一些总结, 以防止出现 “下面呢? 下面没有了” 的尴尬. 方向性问题 虽然题目在一开始就暗示了这一点, 但首先, 我们还是要问, 它能用递归解决吗? 有点怀疑精神是好的, 既要低头走路, 更要抬头看路, 以防…

JDK14新特征最全详解

JDK 14一共发行了16个JEP(JDK Enhancement Proposals&#xff0c;JDK 增强提案)&#xff0c;筛选出JDK 14新特性。 - 343: 打包工具 (Incubator) - 345: G1的NUMA内存分配优化 - 349: JFR事件流 - 352: 非原子性的字节缓冲区映射 - 358: 友好的空指针异常 - 359: Records…

【JavaScript】解决 JavaScript 语言报错:Uncaught TypeError: XYZ is not iterable

文章目录 一、背景介绍常见场景 二、报错信息解析三、常见原因分析1. 对非数组类型使用 for...of 循环2. 对非可迭代对象使用扩展运算符3. 在 Promise.all 中传递非可迭代对象4. 使用解构赋值时&#xff0c;右侧值非可迭代 四、解决方案与预防措施1. 确保使用可迭代对象2. 使用…

各种Attention|即插即用|适用于YoloV5、V7、V8、V9、V10(一)

摘要 本文总结了各种注意力&#xff0c;即插即用&#xff0c;方便大家将注意力加到自己的论文中。 SE import torch from torch import nn class SEAttention(nn.Module): """ SENet&#xff08;Squeeze-and-Excitation Networks&#xff09;中的注意力…