当前位置: 首页 > news >正文

iterator(迭代器模式)

引入

在想显示数组当中所有元素时,我们往往会使用下面的for循环语句来遍历数组

#include <iostream>
#include <vector>int main()
{std::vector<int> v({ 1, 2, 3 });for (int i = 0; i < v.size(); i++){std::cout << v[i] << " " << std::endl;}return 0;
}

下面我们来对比一下,下面这一段遍历代码

#include <iostream>
#include <map>int main()
{std::map<int, int> mp;mp[0] = 1;mp[1] = 2;mp[2] = 3;for(std::map<int, int>::iterator iter = mp.begin(); iter != mp.end(); iter ++){std::cout << "key is " << iter->first << " " << "value is " << iter->second << std::endl;}return 0;
}

二者在功能上实际上是一样的,都是对数据进行遍历输出。
在第一段代码当中,变量i的作用是为了在自增之后,用做访问下一个元素的下标。
在第二段代码当中,变量*iter*也是在自增之后,用来访问mp的下一个元素,我们可以发现, 实际上在第二段代码当中,iterator是对i的一个抽象化、通用化的表达,这就是我们要学习的iterator模式。

iterator模式主要作用是对数据集合按照顺序进行遍历,在遍历的同时还要保证内部信息的封装性,只提供遍历接口。
iterator模式常用于stl容器当中,比如map,list

UML类图

iterator类图

具体代码

book.h

#ifndef __BOOK_H__
#define __BOOK_H__#include <iostream>
#include <string>class Book
{
public:Book(std::string name):m_nameStr(name){std::cout << "value";};~Book() = default;Book(const Book &other) = default;Book& operator=(const Book &other) = default;Book& operator=(Book &&other) = delete;std::string getName() const{return m_nameStr;};
protected:private:std::string m_nameStr;
};#endif //__BOOK_H__

bookshelf.h

#ifndef __BOOKSHELF_H__
#define __BOOKSHELF_H__#include <vector>
#include "book.h"class BookShelf
{
public:BookShelf() = default;~BookShelf() = default;BookShelf(const BookShelf &other) = default;BookShelf& operator=(const BookShelf &other) = default;BookShelf(BookShelf &&other) = delete;BookShelf& operator=(BookShelf &&other) = delete;//实现iteratorclass iterator{public:iterator(Book* tmp = nullptr) :iteratorPtr(tmp) {};iterator& operator++(){iteratorPtr++;return *this;};bool operator==(const iterator& other) const{return this->iteratorPtr == other.iteratorPtr;}bool operator!=(const iterator& other) const{return !(*this == other);}Book& operator*(){return *iteratorPtr;}private:Book* iteratorPtr = nullptr;};//提供遍历起点iterator begin();//提供遍历终点iterator end();//添加书籍void addBook(const Book& tmpBook);
protected:private:std::vector<Book> m_bookList;
};#endif //__BOOKSHELF_H__

bookshelf.cpp

#include "bookshelf.h"BookShelf::iterator BookShelf::begin()
{return iterator(&m_bookList[0]);
}BookShelf::iterator BookShelf::end()
{return iterator(&(m_bookList.back()));
}void BookShelf::addBook(const Book& tmpBook)
{m_bookList.emplace_back(tmpBook);
}

main.cpp

#include "book.h"
#include "bookshelf.h"int main()
{Book book1("第一本书");Book book2("第二本书");Book book3("第三本书");BookShelf woodBookShelf;woodBookShelf.addBook(book1);woodBookShelf.addBook(book2);woodBookShelf.addBook(book3);//得不到vector最后一个元素的后一个地址,所以只会输出//第一本书、第二本书for(BookShelf::iterator iter = woodBookShelf.begin(); iter != woodBookShelf.end(); ++iter){std::cout << (*iter).getName() << std::endl;}system("pause");return 0;
}

面向对象

  • 设计模式的作用就是帮助我们编写可复用的类,当一个组件发生改变时,不需要对其他组件进行修改或是只进行很小的修改就可以应付
  • 不要只用具体的类来编程,要优先使用抽象类和接口编程。

参考资料:图解设计模式

相关文章:

iterator(迭代器模式)

引入 在想显示数组当中所有元素时&#xff0c;我们往往会使用下面的for循环语句来遍历数组 #include <iostream> #include <vector>int main() {std::vector<int> v({ 1, 2, 3 });for (int i 0; i < v.size(); i){std::cout << v[i] << &q…...

使用Web控制端和轻量级客户端构建的开放Web应用防火墙(OpenWAF)

目录 1. 简介2. 项目结构3. Web控制端3.1. 功能概述3.2. 审计&#xff08;攻击&#xff09;日志查看3.3. 多个WAF的集中监控和操作3.4. 使用socket进行封装3.5. 日志的高效存储和检索&#xff08;Redis&#xff09; 4. 轻量级客户端4.1. 功能概述4.2. 对Web程序的防护4.3. 网络…...

设计模式在FileBrowser中的几个应用

设计模式是代码重构的最终目标&#xff0c;在程序设计中有效的运用这项技术&#xff0c;可以大大提高代码的可读性和可维护性。使整个程序设计结构趋向精致完美。在我维护的FileBrowser模块中可以针对以下方面 应用相应的模式。 1. 使用策略模式来处理文件夹扫描操作 作为网…...

【JavaEE进阶】——Spring AOP

目录 &#x1f6a9;Spring AOP概述 &#x1f6a9;Spring AOP快速⼊⻔ &#x1f393;引入AOP依赖 &#x1f393;编写AOP程序 &#x1f6a9;Spring AOP 详解 &#x1f393;Spring AOP核⼼概念 &#x1f393;通知类型 &#x1f393;PointCut &#x1f393;切⾯优先级 Ord…...

Python - conda使用大全

如何使用Conda&#xff1f; 环境 创建环境 conda create -n spider_env python3.10.11查看环境 conda env listconda info -e激活环境 conda activate spider_env退出环境 conda deactivate删除环境 conda env remove -n spider_env包 导出包 说明&#xff1a;导出当前虚拟…...

ASPICE在汽车软件开发中的作用

ASPICE是一个专门为汽车软件开发过程而设计的评估和改进框架。它基于ISO/IEC 15504标准&#xff0c;为汽车供应商提供了一个评估和改进其软件开发流程的方法。ASPICE的目标是确保软件开发过程的一致性和可预测性&#xff0c;从而提高软件的质量和可靠性。 ASPICE的实施对汽车软…...

亚马逊云科技 re:Inforce 2024中国站大会

亚马逊云科技 re:Inforce 2024中国站大会 - 生成式AI时代的全面安全&#xff0c;将于7月25日本周四在北京富力万丽酒店揭幕...

Lottie:动态动画的魔法棒

文章目录 引言官网链接Lottie 的原理基础使用1. 导出动画2. 引入 Lottie 库3. 加载和播放动画 高级使用1. 动画控制2. 交互性3. 自定义动画例子&#xff1a;交互式按钮动画 优缺点优点缺点 结语 引言 Lottie 是 Airbnb 开源的一个动画库&#xff0c;它允许设计师在 Adobe Afte…...

IPython使用技巧整理

IPython 是一个增强的 Python 交互式 shell&#xff0c;它提供了许多便利的功能&#xff0c;比如自动补全、魔术命令、对象内省等。以下是 IPython 的一些使用技巧和示例&#xff0c;结合您提供的列表数据&#xff0c;我将给出一些相关的使用示例。 1. 自动补全&#xff08;Tab…...

C#数组复习

一、一维数组 using System.Collections; using System.Collections.Generic; using UnityEngine;public class ShuZu : MonoBehaviour {#region 知识点一 基本概念//数组是存储一组相同类型数据的集合//数组分为 一维、二维、交错数组//一般情况 一维数组 就简称为数组#en…...

无人机之在农业上的用途

随着无人机技术的发展&#xff0c;农业现代化也迎来了崭新局面&#xff0c;田间随处可见无人机矫健的身影。当农业遇上科技&#xff0c;变革正悄然进行。农业无人机主要应用于农业、种植业、林业等行业。在使用过程中&#xff0c;其功能和作用并不单一&#xff0c;一般用于种植…...

opengaussdb在oepnEuler上安装

安装前提&#xff1a; 软件环境&#xff1a;openEuler 20.03LTS 个人开发者最低配置2核4G&#xff0c;推荐配置4核8G 数据库版本&#xff1a;openGauss-5.0.2-openEuler-64bit-all.tar.gz 数据库下载地址&#xff1a; https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/In…...

一些和颜色相关网站

1.中国传统色 2.网页颜色选择器 3.渐变色网站 4.多风格色卡生成 5.波浪生成 6.半透明磨砂框 7.色卡组合...

Linux系统编程-文件系统

目录 什么是Linux文件系统 文件系统的职责 存储介质抽象 inode&#xff1a;文件系统的核心 文件分配策略 目录结构 文件系统布局 日志和恢复机制 目录权限 粘滞位(t位)&#xff1a; 硬链接和符号链接 硬链接的特点&#xff1a; 创建硬链接&#xff1a; 符号链接的…...

【解决】ubuntu20.04 root用户无法SSH登陆问题

Ubuntu root用户无法登录的问题通常可以通过修改‌SSH配置文件和系统登录配置来解决。 修改SSH配置文件 sudo vim /etc/ssh/sshd_config 找到 PermitRootLogin 设置&#xff0c;并将其值更改为 yes 以允许root用户通过SSH登录 保存并关闭文件之后&#xff0c;需要重启SSH服务…...

(前缀和) LeetCode 238. 除自身以外数组的乘积

一. 题目描述 原题链接 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&…...

【JVM基础05】——组成-能不能解释一下方法区?

目录 1- 引言&#xff1a;方法区概述1-1 方法区是什么&#xff1f;(What)1-2 为什么用方法区&#xff1f;方法区的作用 (Why) 2- ⭐核心&#xff1a;详解方法区(How)2-1 能不能解释一下方法区&#xff1f;2-2 元空间内存溢出问题2-3 什么是常量池&#xff1f;2-4 运行时常量池 …...

前端:Vue学习-3

前端&#xff1a;Vue学习-3 1. 自定义指令2. 插槽2.1 插槽 - 后备内容&#xff08;默认值&#xff09;2.2 插槽 - 具名插槽2.3 插槽 - 作用域插槽 3. Vue - 路由3.1 路由模块封装3.2 声明式导航 router-link 高亮3.3 自定义匹配的类名3.4 声明式导肮 - 跳转传参3.5 Vue路由 - 重…...

npm 安装报错(已解决)+ 运行 “wue-cli-service”不是内部或外部命令,也不是可运行的程序(已解决)

首先先说一下我这个项目是3年前的一个项目了&#xff0c;中间也是经过了多个人的修改惨咋了布置多少个人的思想&#xff0c;这这道我手里直接npm都安装不上&#xff0c;在网上也查询了多种方法&#xff0c;终于是找到问题所在了 问题1&#xff1a; 先是npm i 报错在下面图片&…...

江苏科技大学24计算机考研数据速览,有专硕复试线大幅下降67分!

江苏科技大学&#xff08;Jiangsu University of Science and Technology&#xff09;&#xff0c;坐落在江苏省镇江市&#xff0c;是江苏省重点建设高校&#xff0c;江苏省人民政府与中国船舶集团有限公司共建高校&#xff0c;国家国防科技工业局与江苏省人民政府共建高校 &am…...

Zotero文献管理效率革命:Ethereal Style插件深度应用指南

Zotero文献管理效率革命&#xff1a;Ethereal Style插件深度应用指南 【免费下载链接】zotero-style zotero-style - 一个 Zotero 插件&#xff0c;提供了一系列功能来增强 Zotero 的用户体验&#xff0c;如阅读进度可视化和标签管理&#xff0c;适合研究人员和学者。 项目地…...

Qwen3模型快速部署教程:10分钟搞定GPU环境与首次调用

Qwen3模型快速部署教程&#xff1a;10分钟搞定GPU环境与首次调用 你是不是也对那些动辄几十GB、部署起来让人头大的大模型望而却步&#xff1f;觉得在自己的机器上跑起来一个像样的AI模型&#xff0c;是件门槛很高的事情&#xff1f; 今天&#xff0c;我就带你打破这个刻板印…...

RMBG-2.0抠图工具性能测试:RTX 3060上平均1.8秒处理一张图

RMBG-2.0抠图工具性能测试&#xff1a;RTX 3060上平均1.8秒处理一张图 1. 为什么选择本地抠图工具&#xff1f; 在日常工作和内容创作中&#xff0c;我们经常需要处理图片背景去除的需求。无论是电商产品图、社交媒体配图还是设计素材&#xff0c;一个高效的抠图工具可以大幅…...

nli-distilroberta-base算法优化:利用LSTM思想增强序列上下文建模

nli-distilroberta-base算法优化&#xff1a;利用LSTM思想增强序列上下文建模 1. 效果展示背景 在自然语言推理任务中&#xff0c;nli-distilroberta-base作为轻量级Transformer模型表现出色&#xff0c;但在处理长文本序列时仍面临挑战。传统Transformer架构的自注意力机制虽…...

一天一个开源项目(第56篇):人人都能用英语 - AI 时代的外语学习开源项目

引言 “其实一个字就够了&#xff1a;用。” 这是「一天一个开源项目」系列的第 56 篇文章。今天介绍的项目是 人人都能用英语&#xff08;GitHub&#xff09;。 学英语的核心是什么&#xff1f;李笑来在 2010 年的著作里用一个字概括&#xff1a;用。如今&#xff0c;这个经典…...

ESLyric歌词源一站式配置:Foobar2000多平台格式转换高效解决方案

ESLyric歌词源一站式配置&#xff1a;Foobar2000多平台格式转换高效解决方案 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource ESLyric歌词源是Foobar2000播…...

避坑指南:Windows下OpenCV摄像头索引混乱问题的3种解决之道

避坑指南&#xff1a;Windows下OpenCV摄像头索引混乱问题的3种解决之道 在工业视觉和智能监控领域&#xff0c;多摄像头协同工作是常见需求。但当你在Windows平台上使用OpenCV的VideoCapture接口时&#xff0c;可能会遇到这样的困扰&#xff1a;每次重启系统后&#xff0c;原本…...

别再手动校正了!用Landsat 9 L2SP地表反射率数据,在QGIS里5分钟搞定NDVI和水体提取

遥感分析效率革命&#xff1a;用Landsat 9 L2SP数据在QGIS中实现5分钟精准制图 当遥感数据处理流程从传统数小时缩短至五分钟&#xff0c;这意味着什么&#xff1f;去年在亚马逊雨林监测项目中&#xff0c;我们团队曾因大气校正步骤延误错过了最佳干预时机。如今Landsat 9 L2SP…...

极客专属:OpenClaw+百川2-13B打造个人CLI智能助手

极客专属&#xff1a;OpenClaw百川2-13B打造个人CLI智能助手 1. 为什么开发者需要命令行智能助手 作为一个长期与终端打交道的开发者&#xff0c;我每天要重复执行大量机械操作&#xff1a;查看日志、运行测试、整理结果。这些工作虽然简单&#xff0c;却极其消耗精力。直到我…...

Obsidian Local Images Plus 插件使用指南

Obsidian Local Images Plus 插件使用指南 【免费下载链接】obsidian-local-images-plus This repo is a reincarnation of obsidian-local-images plugin which main aim was downloading images in md notes to local storage. 项目地址: https://gitcode.com/gh_mirrors/o…...