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类图

具体代码
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(迭代器模式)
引入 在想显示数组当中所有元素时,我们往往会使用下面的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. 审计(攻击)日志查看3.3. 多个WAF的集中监控和操作3.4. 使用socket进行封装3.5. 日志的高效存储和检索(Redis) 4. 轻量级客户端4.1. 功能概述4.2. 对Web程序的防护4.3. 网络…...
设计模式在FileBrowser中的几个应用
设计模式是代码重构的最终目标,在程序设计中有效的运用这项技术,可以大大提高代码的可读性和可维护性。使整个程序设计结构趋向精致完美。在我维护的FileBrowser模块中可以针对以下方面 应用相应的模式。 1. 使用策略模式来处理文件夹扫描操作 作为网…...
【JavaEE进阶】——Spring AOP
目录 🚩Spring AOP概述 🚩Spring AOP快速⼊⻔ 🎓引入AOP依赖 🎓编写AOP程序 🚩Spring AOP 详解 🎓Spring AOP核⼼概念 🎓通知类型 🎓PointCut 🎓切⾯优先级 Ord…...
Python - conda使用大全
如何使用Conda? 环境 创建环境 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包 导出包 说明:导出当前虚拟…...
ASPICE在汽车软件开发中的作用
ASPICE是一个专门为汽车软件开发过程而设计的评估和改进框架。它基于ISO/IEC 15504标准,为汽车供应商提供了一个评估和改进其软件开发流程的方法。ASPICE的目标是确保软件开发过程的一致性和可预测性,从而提高软件的质量和可靠性。 ASPICE的实施对汽车软…...
亚马逊云科技 re:Inforce 2024中国站大会
亚马逊云科技 re:Inforce 2024中国站大会 - 生成式AI时代的全面安全,将于7月25日本周四在北京富力万丽酒店揭幕...
Lottie:动态动画的魔法棒
文章目录 引言官网链接Lottie 的原理基础使用1. 导出动画2. 引入 Lottie 库3. 加载和播放动画 高级使用1. 动画控制2. 交互性3. 自定义动画例子:交互式按钮动画 优缺点优点缺点 结语 引言 Lottie 是 Airbnb 开源的一个动画库,它允许设计师在 Adobe Afte…...
IPython使用技巧整理
IPython 是一个增强的 Python 交互式 shell,它提供了许多便利的功能,比如自动补全、魔术命令、对象内省等。以下是 IPython 的一些使用技巧和示例,结合您提供的列表数据,我将给出一些相关的使用示例。 1. 自动补全(Tab…...
C#数组复习
一、一维数组 using System.Collections; using System.Collections.Generic; using UnityEngine;public class ShuZu : MonoBehaviour {#region 知识点一 基本概念//数组是存储一组相同类型数据的集合//数组分为 一维、二维、交错数组//一般情况 一维数组 就简称为数组#en…...
无人机之在农业上的用途
随着无人机技术的发展,农业现代化也迎来了崭新局面,田间随处可见无人机矫健的身影。当农业遇上科技,变革正悄然进行。农业无人机主要应用于农业、种植业、林业等行业。在使用过程中,其功能和作用并不单一,一般用于种植…...
opengaussdb在oepnEuler上安装
安装前提: 软件环境:openEuler 20.03LTS 个人开发者最低配置2核4G,推荐配置4核8G 数据库版本:openGauss-5.0.2-openEuler-64bit-all.tar.gz 数据库下载地址: https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/In…...
一些和颜色相关网站
1.中国传统色 2.网页颜色选择器 3.渐变色网站 4.多风格色卡生成 5.波浪生成 6.半透明磨砂框 7.色卡组合...
Linux系统编程-文件系统
目录 什么是Linux文件系统 文件系统的职责 存储介质抽象 inode:文件系统的核心 文件分配策略 目录结构 文件系统布局 日志和恢复机制 目录权限 粘滞位(t位): 硬链接和符号链接 硬链接的特点: 创建硬链接: 符号链接的…...
【解决】ubuntu20.04 root用户无法SSH登陆问题
Ubuntu root用户无法登录的问题通常可以通过修改SSH配置文件和系统登录配置来解决。 修改SSH配置文件 sudo vim /etc/ssh/sshd_config 找到 PermitRootLogin 设置,并将其值更改为 yes 以允许root用户通过SSH登录 保存并关闭文件之后,需要重启SSH服务…...
(前缀和) LeetCode 238. 除自身以外数组的乘积
一. 题目描述 原题链接 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&…...
【JVM基础05】——组成-能不能解释一下方法区?
目录 1- 引言:方法区概述1-1 方法区是什么?(What)1-2 为什么用方法区?方法区的作用 (Why) 2- ⭐核心:详解方法区(How)2-1 能不能解释一下方法区?2-2 元空间内存溢出问题2-3 什么是常量池?2-4 运行时常量池 …...
前端:Vue学习-3
前端:Vue学习-3 1. 自定义指令2. 插槽2.1 插槽 - 后备内容(默认值)2.2 插槽 - 具名插槽2.3 插槽 - 作用域插槽 3. Vue - 路由3.1 路由模块封装3.2 声明式导航 router-link 高亮3.3 自定义匹配的类名3.4 声明式导肮 - 跳转传参3.5 Vue路由 - 重…...
npm 安装报错(已解决)+ 运行 “wue-cli-service”不是内部或外部命令,也不是可运行的程序(已解决)
首先先说一下我这个项目是3年前的一个项目了,中间也是经过了多个人的修改惨咋了布置多少个人的思想,这这道我手里直接npm都安装不上,在网上也查询了多种方法,终于是找到问题所在了 问题1: 先是npm i 报错在下面图片&…...
江苏科技大学24计算机考研数据速览,有专硕复试线大幅下降67分!
江苏科技大学(Jiangsu University of Science and Technology),坐落在江苏省镇江市,是江苏省重点建设高校,江苏省人民政府与中国船舶集团有限公司共建高校,国家国防科技工业局与江苏省人民政府共建高校 &am…...
PasteMD场景应用:微信聊天记录自动整理为会议纪要
PasteMD场景应用:微信聊天记录自动整理为会议纪要 1. 为什么你的会议纪要总是一团糟? 想象一下这个场景: 下午两点,项目组紧急拉了个微信群聊,大家七嘴八舌讨论了半小时,敲定了五个关键事项和三个责任人。…...
淘宝母婴购物数据可视化分析:从数据清洗到商业洞察
1. 淘宝母婴数据清洗实战:从原始数据到分析就绪 做数据分析最头疼的就是拿到一堆乱七八糟的原始数据,淘宝母婴数据也不例外。我最近处理过一批天池比赛的脱敏数据,光是清洗环节就踩了不少坑。先说说最基础的CSV导入,用pandas的rea…...
PX4无人机开发实战:5个关键ROS话题的订阅与发布详解(附代码示例)
PX4无人机开发实战:5个关键ROS话题的订阅与发布详解(附代码示例) 当你在PX4无人机开发中首次接触ROS通信时,可能会被各种话题和服务搞得晕头转向。作为连接飞控与外部系统的桥梁,这些通信接口直接决定了无人机的可控性…...
OpenClaw数据可视化:GLM-4.7-Flash分析结果自动图表生成
OpenClaw数据可视化:GLM-4.7-Flash分析结果自动图表生成 1. 为什么需要自动化数据可视化 作为一名经常需要处理数据的开发者,我发现自己80%的时间都花在了数据清洗和图表调整上。每次分析新数据集时,都要重复这些步骤:写Python脚…...
解决Windows内存不足困扰:Mem Reduct内存管理实战指南
解决Windows内存不足困扰:Mem Reduct内存管理实战指南 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct 您…...
5G NR PUSCH实战:手把手教你理解Type A/B时域映射与SLIV计算(附避坑指南)
5G NR PUSCH实战:Type A/B时域映射与SLIV计算全解析 从理论到实践:PUSCH时域资源分配的核心逻辑 在5G NR系统中,物理上行共享信道(PUSCH)的时域资源分配直接决定了上行数据传输的效率和可靠性。对于物理层开发工程师而…...
移动机器人自主导航与集群协同:从单机优化到群体智能
1. 移动机器人自主导航的核心框架 当你第一次看到扫地机器人在房间里自如穿梭时,有没有好奇过它是如何做到的?这背后就是移动机器人自主导航技术的魔力。简单来说,自主导航系统就像机器人的"大脑",由感知、规划、控制三…...
实时数据流处理实战:从滑动窗口算法到Docker部署
用 Python 造一个轻量级流处理引擎,顺便把 Git、Docker、CI/CD 全串起来 前言 你是否有过这样的需求:统计过去 5 秒内 API 的请求次数、监控传感器数据的突变、或者对直播间的弹幕进行限流?这些场景都离不开实时数据流处理。而流处理的核心&…...
【Unity3D】从零打造动态天空盒:Cubemap生成与实时环境映射实战
1. 动态天空盒的核心原理与场景价值 第一次在Unity里看到动态天空盒效果时,我盯着屏幕愣了三秒——云层在头顶流动,夕阳的光影实时投射在建筑表面,整个场景瞬间有了生命力。这种魔法般的体验,其实都建立在立方体贴图(C…...
颠覆性AI语音转换技术深度解析:Retrieval-based-Voice-Conversion-WebUI的5大创新特性揭秘
颠覆性AI语音转换技术深度解析:Retrieval-based-Voice-Conversion-WebUI的5大创新特性揭秘 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI 语音数据小于等于10分钟也可以用来训练一个优秀的变声模型! 项目地址: https://gitcode.com/GitHub…...
