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…

高级Puppet manifest编写和模块化管理:构建高效可靠的自动化运维平台

高级Puppet manifest编写和模块化管理&#xff1a;构建高效可靠的自动化运维平台 Puppet是一种流行的开源自动化运维工具&#xff0c;可以自动化IT基础设施的配置和管理。Puppet使用声明性语言来描述系统状态&#xff0c;并通过客户端-服务器模型来实现自动化。Puppet manifes…

[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配置深…

代码随想录 day38 动态规划part04

416. 分割等和子集 给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200示例 1:输入: [1, 5, 11, 5] 输出: true 解释: 数组可以分割成 [1, 5, 5] 和 [11]. …

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动态…

解决spring boot中使用拦截器导致swagger文档无法访问

目录 问题场景 解决方案 问题场景 我们的spring boot项目通常会使用接口文档管理依赖如knife4j(swagger3) Spring Boot3整合knife4j(swagger3)_springboot3 knife4j-CSDN博客 通常也会使用拦截器来做登录鉴权、接口限流等操作&#xff0c;但是使用拦截器会导致swagger接口…

FFmpeg学习(五)-- libswresample使用说明及函数介绍

libswresample Audio合成和重采样 libswresample库用来进行audio数据的合成和重采样操作。调用流程&#xff1a; 调用 swr_alloc 创建SwrContext结构体。设置SwrContext参数&#xff0c;有两种方法&#xff1a; 调用av_opt_set_xx函数逐项设置参数&#xff1b;swr_alloc_set_…

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

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

04.为什么line-height是无单位的 兄弟元素淡出效果 蚀刻文字效果

为什么 CSS 中的 line-height 应该是无单位的? 我经常听说 line-height 应该始终是无单位的。在我早期的编码年代,我没有过多地质疑这一点,但最近我开始想知道为什么会这样。在我看来,1.5 和 1.5em 应该产生相同的结果,对吧?事实证明,它们并非如此。 两者之间有一个细微的区…

记一下blender曲线阵列

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

Dockerfile指令

Dockerfile指令 1、Dockerfile指令? 1)、COPY&#xff1a;类似ADD&#xff0c;将我们的文件拷贝到镜像中&#xff0c;也就是复制本地(宿主机)上的文件到镜像。 COPY [--chown<user>:<group>] ["<源路径1>",... "<目标路径>"] …

.快速幂.

按位与&#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;不垂…

Django是干什么的?好用么?

Django是一个开源的Python Web框架&#xff0c;用于快速开发高质量的Web应用程序。它提供了许多功能和工具&#xff0c;以简化常见的Web开发任务&#xff0c;如路由、请求处理、数据库管理等。 Django的优点包括&#xff1a; 简单易用&#xff1a;Django提供了清晰的文档和丰…