篇十九:迭代器模式:遍历集合
篇十九:"迭代器模式:遍历集合"
开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。
另外有2本不错的关于设计模式的资料,分享出来与大家学习参考。
链接:https://pan.baidu.com/s/1RmhQF_o1CdK8U7s5KeILog?pwd=xc6d
提取码:xc6d
设计模式是软件开发中的重要知识,迭代器模式(Iterator Pattern)是一种行为型设计模式,用于提供一种统一的方式遍历集合中的元素,而无需暴露集合的内部表示。本文将解释迭代器模式的概念和使用场景,并展示在C++中实现迭代器模式的技巧。
1. 迭代器模式的概念:
迭代器模式是一种通过提供一种统一的方式来访问集合中的元素,而无需了解集合的内部表示的设计模式。它包含以下核心角色:
- 迭代器(Iterator):定义访问和遍历集合元素的接口。
- 具体迭代器(Concrete Iterator):实现迭代器接口,负责遍历集合中的元素。
- 集合(Collection):定义创建迭代器的接口。
- 具体集合(Concrete Collection):实现集合接口,负责创建具体迭代器。
迭代器模式的关键在于将遍历集合的逻辑封装在迭代器中,从而使得客户端代码与集合的具体表示解耦,提高了代码的灵活性和可维护性。
2. 迭代器模式的使用场景:
迭代器模式在以下情况下特别有用:
- 当集合的内部表示发生变化时,不希望客户端代码受到影响。
- 当需要提供多种遍历方式时,可以通过迭代器模式在不修改集合代码的情况下实现。
3. 在C++中实现迭代器模式的技巧:
以下是迭代器模式的C++示例代码:
a. 定义迭代器接口:
// Iterator.h
template <typename T>
class Iterator {
public:virtual ~Iterator() {}virtual bool hasNext() const = 0;virtual T next() = 0;
};
b. 定义集合接口:
// Collection.h
#include "Iterator.h"template <typename T>
class Collection {
public:virtual ~Collection() {}virtual Iterator<T>* createIterator() = 0;virtual void addItem(const T& item) = 0;virtual size_t size() const = 0;virtual T& operator[](size_t index) = 0;
};
c. 定义具体迭代器类:
// ConcreteIterator.h
#include "Iterator.h"
#include "Collection.h"template <typename T>
class ConcreteIterator : public Iterator<T> {
public:ConcreteIterator(Collection<T>* collection) : collection_(collection), index_(0) {}bool hasNext() const override {return index_ < collection_->size();}T next() override {if (hasNext()) {return (*collection_)[index_++];}throw std::out_of_range("Iterator out of range.");}private:Collection<T>* collection_;size_t index_;
};
d. 定义具体集合类:
// ConcreteCollection.h
#include "Collection.h"
#include <vector>template <typename T>
class ConcreteCollection : public Collection<T> {
public:Iterator<T>* createIterator() override {return new ConcreteIterator<T>(this);}void addItem(const T& item) override {items_.push_back(item);}size_t size() const override {return items_.size();}T& operator[](size_t index) override {return items_[index];}private:std::vector<T> items_;
};
e. 客户端使用:
// main.cpp
#include <iostream>
#include "ConcreteCollection.h"int main() {ConcreteCollection<int> collection;collection.addItem(1);collection.addItem(2);collection.addItem(3);Iterator<int>* iterator = collection.createIterator();while (iterator->hasNext()) {std::cout << iterator->next() << " ";}delete iterator;return 0;
}
4. 迭代器模式的代码解析:
在迭代器模式中,通过将集合的遍历逻辑封装在迭代器中,实现了集合的遍历和客户端代码的解耦。客户端通过迭代器接口来访问集合中的元素,无需关心集合的内部表示,从而提高了代码的灵活性和可维护性。
5. 最佳实践:
在使用迭代器模式时,需要注意以下几点:
- 合理设计迭代器接口:迭代器接口应该定义统一的访问集合元素的方式,确保客户端代码能够方便地遍历集合。
- 状态对象生命周期管理:在具体集合类中,需要负责管理集合元素的生命周期,确保在遍历过程中不会出现内存访问错误。
6. 总结:
迭代器模式是一种重要的设计模式,它通过将集合的遍历逻辑封装在迭代器中,提供了一种统一的方式来访问集合中的元素。在C++中,我们可以通过抽象迭代器类和具体迭代器类来实现迭代器模式。迭代器模式在遍历集合的应用场景中非常有用,能够提高代码的灵活度和可维护性。
希望本文能够帮助您理解迭代器模式的概念和使用场景,并通过C++的示例代码演示了如何在C++中实现迭代器模式来遍历集合。设计模式是软件开发中的重要知识,掌握不同的设计模式有助于提高代码质量、可维护性和可扩
展性。
参考文献:
- Gamma, E., Helm, R., Johnson, R., & Vlissides, J. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley Professional.
- C++ Core Guidelines: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
感谢您的阅读,欢迎一起探讨,共同进步,推荐大家使用学习助手AIRight来解答学习过程中的问题,访问链接:http://airight.fun/
相关文章:
篇十九:迭代器模式:遍历集合
篇十九:"迭代器模式:遍历集合" 开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。 另外有2本不错的关于设计模式的资料&…...
浅谈JVM中的即时编译器(Just-In-Time compiler, JIT)
Java虚拟机(JVM)中的即时编译器(Just-In-Time compiler, JIT)是一个非常重要的组件,它负责将字节码转换为本地机器代码。在不使用JIT的情况下,JVM通过解释字节码来执行程序,这意味着它会为每个字…...
Android 13 Launcher——长按图标弹窗内容修改以及小组件等隐藏起来
目录 一.背景 二.实现思路 三.布局文件修改 四.隐藏代码中原先的view 一.背景 由于定制化开发需要将原先的长按图标原生弹窗界面隐藏,然后显示自定义的弹窗界面,如下就是我们来实现自定义的弹窗界面...
又一个不可错过的编程大模型来了让你惊呼“码农人生”不虚此行
继Stable Diffusion爆火之后,StabilityAI近期又放大招,推出了号称是革命性的编程大模型StableCode。StableCode是其首款用于编码的LLM生成式AI产品,该产品旨在帮助程序员完成日常工作。目前已发布的版本为StableCode-Completion-Alpha-3B&…...
【Express.js】集成SocketIO
集成SocketIO 本节我们介绍在如何在 express 中集成 Socket.IO Socket.IO 算是 WebSocket 的一个超集,进行了一些封装和拓展。 准备工作 创建一个 express.js 项目(本文基于evp-express-cli)安装socket.io.js: npm i socket.io创建代理 …...
为树莓派Pico配置交叉编译环境和工具链arm-none-eabi-gcc时可能会遇到的错误以及解决方案
本文是一个类似手册的文章,用来记录可能遇到的错误。你可以通过侧栏选择遇到的错误来查看详细信息。 No install step for ‘ELF2UF2Build’ 遇到这种错误有两种原因: 安装了版本不对或者不完整的arm-none-eabi-gcc;没有使用正确的 C/C 的…...
Yum 部署K8S集群
目录 1、准备环境 (温馨提示:尽量一次完成集群) 2.安装master节点 3、安装k8s-master上的node 4、安装配置k8s-node1节点 5、安装k8s-node2节点 6、为所有node节点配置flannel网络 7、配置docker开启加载防火墙规则允许转发数据 一. 环…...
初阶C语言-操作符详解(下)
🌞 “等春风得意,等时间嘉许!” 接下来,我们把操作符没学完的继续学完! 操作符详解 6.2sizeof和数组 7.关系操作符8.逻辑操作符9.条件操作符10.逗号表达式11.下标引用、函数调用和结构成员12.表达式求值12.1隐式类型转…...
reposync命令——下载yum仓库中全部的包到本地
reposync命令可以将远端yum仓库里面的包全部都下载到本地。这样构建自己的yum仓库,就不会遇到网络经常更新包而头疼的事情了。 reposync命令在软件包 yum-utils 里面,需要保证yum-utils已安装。 yum install yum-utils -y 常用参数 -r :指定…...
LC-杨辉三角
LC-杨辉三角 链接:https://leetcode.cn/problems/pascals-triangle/submissions/ 上图就是一个杨辉三角,每个数等于他左上角的数与右上角的数之和。 第一行就是一个1;第二行是两个1;第三行的2就是它肩膀上两个1之和,其余的类似。…...
Golang空结构体struct{}的作用是什么?
文章目录 占位符:通道标识:键集合:内存占用优化:总结: 在Go语言中,空结构体 struct{}是一种特殊的数据类型,它不占用任何内存空间。空结构体没有任何字段,也没有任何方法。尽管它看起…...
自然语言处理从入门到应用——LangChain:提示(Prompts)-[示例选择器(Example Selectors)]
分类目录:《自然语言处理从入门到应用》总目录 如果我们拥有大量的示例,我们可能需要选择在提示中包含哪些示例。ExampleSelector是负责执行此操作的类。 其基本接口定义如下所示: class BaseExampleSelector(ABC):"""Interf…...
【实战项目】c++实现基于reactor的高并发服务器
基于Reactor的高并发服务器,分为反应堆模型,多线程,I/O模型,服务器,Http请求和响应五部分 全局 反应堆模型 Channel 描述了文件描述符以及读写事件,以及对应的读写销毁回调函数,对应存储ar…...
Docker部署ElasticSearch7
前言 帮助小伙伴快速部署研发或测试环境进行学习测试。springboot版本需要与ElasticSearch版本想对应,不同版本api不一致,会产生异常调用的情况。 一、拉取镜像 这里选择固定版本7.15.2 docker pull docker.elastic.co/elasticsearch/elasticsearch:…...
【算法|数组】滑动窗口
算法|数组——滑动窗口 引入 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度**。**如果不存在符合条件的子数组,返回 0 。 示例…...
笙默考试管理系统-MyExamTest----codemirror(2)
笙默考试管理系统-MyExamTest----codemirror(2) 目录 一、 笙默考试管理系统-MyExamTest----codemirror 二、 笙默考试管理系统-MyExamTest----codemirror 三、 笙默考试管理系统-MyExamTest----codemirror 四、 笙默考试管理系统-MyExamTest---…...
一次面试下来Android Framework 层的源码就问了4轮
说起字节跳动的这次面试经历,真的是现在都让我感觉背脊发凉,简直被面试官折磨的太难受了。虽然已经工作了七年,但是也只是纯粹的在写业务,对底层并没有一个很深的认识,这次面试经历直接的让我感受到我和那些一线大厂开…...
知网期刊《中阿科技论坛》简介及投稿须知
知网期刊《中阿科技论坛》简介及投稿须知 主管单位:宁夏回族自治区科学技术厅 主办单位:宁夏回族自治区对外科技交流中心(中国一阿拉伯国家技术转移中心) 刊 期:月刊 国际刊号:ISSN 2096-7268 国内刊号:CN 64-…...
kafka是有序的吗?如何保证有序?
首先,Kafka无法保证消息的全局有序性,这是因为Kafka的设计中允许多个生产者并行地向同一个主题写入消息。而且,一个主题可能会被划分为多个分区,每个分区都可以在独立的生产者和消费者之间进行并行处理。因此,生产者将…...
centos 定时脚本检测tomcat是否启动,未启动情况下重新启动
编写脚本 tomcatMonitor.sh #!/bin/sh. /etc/profile . ~/.bash_profile#首先用ps -ef | grep tomcat 获得了tomcat进程信息,这样出来的结果中会包含grep本身, #因此通过 | grep -v grep 来排除grep本身,然后通过 awk {print $2}来打印出要…...
CC Switch搭建到vscode
适配 win 和 Ubuntu 下的环境cc-switch下载 通过网盘分享的文件:CC-Switch 链接: https://pan.baidu.com/s/1YthfhQSnk3S4RvajG6Ax8Q?pwd8rtr 提取码: 8rtrwin 使用 CC-Switch-v3.12.3-Windows.msiUbuntu 22 以下使用 CC-Switch-cli-linux-x64-musl.tar.gzUbuntu 2…...
从0到1搭建可靠消息链路:RocketMQ重试 + Redis幂等实战
三方消息对接为什么总翻车?一套 RocketMQ Redis 幂等 的工业级解法(含架构图伪代码) 🔥 适合收藏:三方平台对接、商品/订单同步、消息中台治理 ✅ 你将收获:一套可直接落地的“拉取-发送-消费-重试-幂等-补…...
AVP系统背后的技术拆解:车端、场端、云端到底谁在“开车”?
AVP系统技术全景:车端、场端与云端的协同博弈 当一辆特斯拉Model 3在商场停车场自动寻找车位时,它可能正经历着三种技术路线的激烈博弈。AVP(自主代客泊车)系统作为自动驾驶技术中最先商业化的场景,其背后的技术架构选…...
.NET 新特性概览与相关文章索引竿
从 UI 工程师到 AI 应用架构者 13 年前,我的工作是让按钮在 IE6 上对齐; 13 年后,我用 fetch-event-source 订阅大模型的“思维流”,用 OCR 解锁图片中的文字——前端,正在成为 AI 产品的第一道体验防线。 最近&#x…...
超级千问语音设计世界应用案例:快速生成短视频配音与游戏角色语音
超级千问语音设计世界应用案例:快速生成短视频配音与游戏角色语音 1. 引言:当语音合成遇上像素冒险 在内容创作领域,声音设计往往是最容易被忽视却又至关重要的环节。无论是短视频创作者需要快速生成旁白,还是独立游戏开发者需要…...
Vue3 响应式系统是如何实现依赖收集的?通俗易懂的 Proxy 机制解析
Vue3响应式核心用Proxy替代Object.defineProperty,通过get/set拦截实现按需依赖收集与触发;读取时track记录effect,修改时trigger通知更新。Vue3 的响应式核心靠 Proxy 实现依赖收集,它不像 Vue2 那样遍历所有属性去 defineProper…...
如何快速安装sw工具:面向开发者的完整指南
如何快速安装sw工具:面向开发者的完整指南 【免费下载链接】sw 项目地址: https://gitcode.com/syntaxsage/sw 前言 sw是一个简洁高效的开发工具,专为提升开发者工作效率而设计。无论您是前端开发者还是后端工程师,sw都能帮助您简化…...
ESP32硬件定时器中断库:实现高精度、非阻塞多定时任务
1. ESP32TimerInterrupt 库深度技术解析:硬件定时器中断的工程化实现与应用1.1 项目定位与核心价值ESP32TimerInterrupt 是一个面向嵌入式实时控制场景的底层定时器抽象库,其根本目标并非简单封装硬件寄存器,而是解决 ESP32 系列 SoC 在复杂多…...
从CubeMX到AC6:STM32H743的MPU与分散加载文件(.sct)配置避坑全记录(LWIP+FreeRTOS)
STM32H743网络协议栈实战:LWIPFreeRTOS在AC6编译器下的MPU与分散加载配置指南 1. 复杂存储架构下的开发挑战 STM32H7系列微控制器以其高性能和丰富的外设资源著称,但其复杂的存储架构也给开发者带来了不小的挑战。该系列芯片采用多总线矩阵和多种内存类型…...
如何用BilibiliDown轻松下载B站视频:免费跨平台视频下载器终极指南
如何用BilibiliDown轻松下载B站视频:免费跨平台视频下载器终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/…...
