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

news2024/11/15 13:25:41

前言

       "打牢基础,万事不愁" .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.coloradmin.cn/o/1925346.html

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

相关文章

Sortable.js板块拖拽示例

图例 代码在图片后面 点赞❤️关注&#x1f64f;收藏⭐️ 页面加载后显示 拖拽效果 源代码 由于js库使用外链&#xff0c;所以会加载一会儿 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name&qu…

Pycharm 导入 conda 环境

使用时经常在此处卡壳&#xff0c;在此做个记录。 这个位置选择 conda 安装路径下的 python.exe 文件即可

书生浦语大模型实战营---Linux 基础知识

创建开发机 开建开发机首先填写开发机名称&#xff0c;选择镜像和配置资源&#xff0c;最后选择立即创建 ssh免密钥登陆 1、本地执行ssh-keygen -t rsa&#xff0c;然后一路回车就可以了 2、执行cat ~/.ssh/id_rsa.pub 3、回到开发机平台&#xff0c;在首页点击配置SSH Key…

手机数据恢复篇:如何从 Android 设备内恢复数据

如何从 Android 内部存储恢复数据&#xff1f; 要从 Android 内部存储恢复已删除的文件&#xff0c;您需要一个 Android 内部存储恢复应用或程序。请继续阅读以获取可靠的 Android 数据恢复软件&#xff0c;并让它帮助您从 Android 手机的内部存储恢复数据。 是否有可能恢复 An…

工业大数据是什么?应用工业大数据时面临哪些挑战?

在当今快速发展的工业领域&#xff0c;大数据已成为推动企业转型升级的核心动力。工业大数据&#xff0c;以其独特的价值和潜力&#xff0c;正逐渐改变着传统的生产、管理和决策模式。然而&#xff0c;伴随着大数据的快速发展&#xff0c;一系列挑战也随之浮现。本文将深入探讨…

刷题之单词规律同构字符串(leetcode)

同构字符串 单词规律 两个都是映射关系&#xff0c;用两张哈希表记录互相映射就可以了 同构字符串&#xff1a; class Solution { public:bool isIsomorphic(string s, string t) {//用两张哈希表做映射if(s.size()!t.size()){return false;}unordered_map<char,char&…

零基础学JS之APIS

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

算法day04 位运算 插入排序 二分法 对数器

位运算: 1&#xff09;有一个数组只包含这样的数&#xff0c;有几个数出现偶数次&#xff0c;有1个数出现奇数次&#xff0c;要求时间复杂度不超过o(n),怎么求出现奇数次的数。 使用 ^ 异或运算整个数组&#xff0c;偶数次运算结果为0&#xff0c;只留下最后一个奇数次的数。 …

【零基础】学JS之APIS第四天

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

网络层重点协议—IP协议

在复杂的网络环境中确定一个合适的路径 协议头格式如下&#xff1a; 4位版本号(version) 指定协议的版本&#xff08;IPV4-4,IPV6-6&#xff09; 4位首部长度(header length) IP头部的长度是多少个32bit&#xff0c;也就是length*4的字节数。4bit表示最大的数字是15&#x…

记一次TIDB开启TLS失败导致PD扩容失败案例

作者&#xff1a; Dora 原文来源&#xff1a; https://tidb.net/blog/8ee8f295 问题背景 集群之前由于TIUP目录被删除导致TLLS证书丢失&#xff0c;后续需要重新开启TLS 在测试环境测试TLS开启步骤&#xff0c;导致后续两台PD扩容失败&#xff0c;步骤如下&#xff1a; …

Linux Win 10 Windows上安装Ollama部署大模型qwen2 7b/15配置启动 LangChain-ChatChat 0.2.10进行对话

Win 10 Window安装Ollama部署qwen2 7b LangChain-ChatChat 环境说明 Win 10 Python 3.11.9 LangChain-ChatChat 0.20 Ollama 0.2.10 Qwen2 1.5b/7b Windows 安装Ollama 下载并安装Windows版Ollama https://ollama.com/download#/ 下载大模型qwen2:1.5b或者qwen2:7b 在命令…

电子技术员基础

这是介绍电子技术员必须掌握的基础知识&#xff0c;在维修和测试中可能有所帮助。放在电脑里有几十年了&#xff0c;是我早期在做电子技术员期间做的文档&#xff0c;所有插图都是自己做的&#xff0c;当初学习态度是绝对认真。如果把这股子劲用在考研上呢&#xff0c;... ...&…

Dataset for Stable Diffusion

1.Dataset for Stable Diffusion 笔记来源&#xff1a; 1.Flickr8k数据集处理 2.处理Flickr8k数据集 3.Github&#xff1a;pytorch-stable-diffusion 4.Flickr 8k Dataset 5.dataset_flickr8k.json 6.About Train, Validation and Test Sets in Machine Learning Tarang Shah …

python-28-零基础自学python-json存数据、读数据,及程序合并

学习内容&#xff1a;《python编程&#xff1a;从入门到实践》第二版 知识点&#xff1a; import json引入、 try-except-else return def函数、打开文件、 练习内容&#xff1a; 练习10-11&#xff1a;喜欢的数 编写一个程序&#xff0c;提示用户输入喜欢的数&#xff…

机器学习基本概念,Numpy,matplotlib和张量Tensor知识进一步学习

机器学习一些基本概念&#xff1a; 监督学习 监督学习是机器学习中最常见的形式之一&#xff0c;它涉及到使用带标签的数据集来训练模型。这意味着每条训练数据都包含输入特征和对应的输出标签。目标是让模型学会从输入到输出的映射&#xff0c;这样当给出新的未见过的输入时…

06:串口通信一

串口通信初识 1、串口的基本认识2、串口的电平3、接线方式4、通过单片机向PC发送每隔1s发送一个字符A 1、串口的基本认识 串口也就是接口&#xff0c;称串行通信接口或串行通讯接口(通常指COM接口)&#xff0c;是采用串行通信方式的扩展接口。用来进行数据一位一位地顺序传送。…

【2024_CUMCM】时间序列4-实战

目录 思考建模思路 例1 定义date 创建时间序列模拟器 结果分析 例2 序列图 创建时间序列模型 未除去异常值 剔除有异常值 勾选 结果 注 思考建模思路 &#xff08; 1 &#xff09;处理数据的缺失值问题、生成时间变量并画出时间序列图&#xff1b; &…

OpenGL笔记九之彩色三角形与重心插值算法

OpenGL笔记九之彩色三角形与重心插值算法 —— 2024-07-07 晚上 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记九之彩色三角形与重心插值算法1.运行3.main.cpp 1.运行 3.main.cpp 代码 #include <iostream>#define DEBUG//注意&#xff1a;glad…

算法 —— 高精度

目录 加法高精度 两个正整数相加 两个正小数相加 两正数相加 减法高精度 两个正整数相减 两个正小数相减 两正数相减 加减法总结 乘法高精度 两个正整数相乘 两个正小数相乘 乘法总结 加法高精度 题目来源洛谷&#xff1a;P1601 AB Problem&#xff08;高精&#x…