设计模式之迭代器模式(Iterator)的C++实现

news2024/12/24 4:49:59

1、迭代器模式的提出

在软件开发过程中,操作的集合对象内部结构常常变化,在访问这些对象元素的同时,也要保证对象内部的封装性。迭代器模式提供了一种利用面向对象的遍历方法来遍历对象元素。迭代器模式通过抽象一个迭代器类,不同的对象继承自迭代器类,外部通过统一接口访问元素。

2、需求描述

设计一个能添加数据元素的容器类,并且能够遍历容器数据元素。

3、功能实现

(1)UML图如下:

(2)代码实现如下:

#include <iostream>
#include <vector>

// 抽象迭代器接口
template<typename T>
class Iterator {
public:
    virtual T& operator*() = 0;
    virtual Iterator<T>& operator++() = 0;
    virtual bool operator!=(const Iterator<T>& other) const = 0;
    virtual ~Iterator(){};
};

// 具体迭代器类
template<typename T>
class ConcreteIterator : public Iterator<T> {
public:
    ConcreteIterator(T* ptr) : m_ptr(ptr) {}

    T& operator*() override {
        return *m_ptr;
    }

    Iterator<T>& operator++() override {
        ++m_ptr;
        return *this;
    }
    bool operator!=(const Iterator<T>& other) const override {
        const ConcreteIterator* concreteOther = dynamic_cast<const ConcreteIterator*>(&other);
        return m_ptr != concreteOther->m_ptr;
    }

private:
    T* m_ptr;
};

// 具体容器类
template<typename T>
class Container {
public:
    void add(const T& element) {
        m_elements.push_back(element);
    }

    Iterator<T>* begin() {
        return  new ConcreteIterator<T>(&m_elements[0]);
    }

    Iterator<T>* end() {
        return new ConcreteIterator<T>(&m_elements[m_elements.size()]);
    }
private:
    std::vector<T> m_elements;
};

class Client
{
public:
    void doWork()
    {
        Container<float> container;
        container.add(1.0);
        container.add(2.0);
        container.add(3.2);

        Iterator<float>* itBegin = container.begin();
        Iterator<float>* itEnd = container.end();
        while (*itBegin != *itEnd) {
            std::cout << **itBegin << "\n";
            ++(*itBegin);
        }

        delete itBegin;
        delete itEnd;
        itBegin = nullptr;
        itEnd = nullptr;
    }
};

int main() {

    Client obj;
    obj.doWork();
    return 0;
}

程序运行结果如下:

 根据容器下标实现的迭代器模式方法也可参考:设计模式-迭代器模式 C++实现_c++ 迭代器模式_MachineChen的博客-CSDN博客

4、面向对象实现迭代器分析

面向对象实现的迭代器模式是在程序运行时,通过虚函数去操作对象元素;相比于C++中的泛型编程实现迭代器的运行性能较低(泛型编程是在编译时已确定访问的元素),所以建议使用泛型编程实现迭代器。

5、泛型编程实现迭代器

#include <iostream>
#include <vector>

template<typename T>
class Iterator {
public:
    Iterator(T* ptr) : m_ptr(ptr) {}

    // 解引用操作符
    T& operator*() {
        return *m_ptr;
    }

    // 前缀自增操作符
    Iterator& operator++() {
        ++m_ptr;
        return *this;
    }

    // 后缀自增操作符
    Iterator operator++(int) {
        Iterator iterator = *this;
        ++m_ptr;
        return iterator;
    }

    // 比较操作符
    bool operator!=(const Iterator& other) const {
        return m_ptr != other.m_ptr;
    }

private:
    T* m_ptr;
};

template<typename T>
class Container {
public:
    void add(const T& element) {
        m_elements.push_back(element);
    }

    Iterator<T> begin() {
        return Iterator<T>(&m_elements[0]);
    }

    Iterator<T> end() {
        return Iterator<T>(&m_elements[m_elements.size()]);
    }

private:
    std::vector<T> m_elements;
};

class Client
{
public:
    void doWork()
    {
        Container<float> container;
        container.add(1.0);
        container.add(2.0);
        container.add(3.2);

        for (Iterator<float> it = container.begin(); it != container.end(); ++it) {
            std::cout << *it << "\n";
        }
    }
};

int main() {
    Client obj;
    obj.doWork();
    return 0;
}

程序运行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/903557.html

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

相关文章

list使用

list的使用于string的使用都类似&#xff0c;首先通过查阅来看list有哪些函数&#xff1a; 可以看到函数还是蛮多的&#xff0c;我们值重点一些常用的和常见的&#xff1a; 1.关于push_back,push_front,和对应迭代器的使用 //关于push_back和push_front void test_list1() {l…

算法通关村——字符串反转问题解析

1. 反转字符串 反转字符串 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 1.1 交换 这一题的思路还是简单的&…

Flink状态和状态管理

1.什么是状态 官方定义&#xff1a;当前计算流程需要依赖到之前计算的结果&#xff0c;那么之前计算的结果就是状态。 这句话还是挺好理解的&#xff0c;状态不只存在于Flink&#xff0c;也存在生活的方方面面&#xff0c;比如看到一个认识的人&#xff0c;如何识别认识呢&am…

程序的编译流程

程序的编译过程大致可以分为以下几个阶段

八大排序算法 - Java实现

冒泡排序 排序原理&#xff1a; 比较相邻的元素。如果前一个元素比后一个元素大&#xff0c;就交换这两个元素的位置。对每一对相邻元素做同样的工作&#xff0c;从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大值 代码实现&#xff1a; import java.uti…

图神经网络学习

入门 目的&#xff1a;训练一个图模型&#xff0c;使得该图模型可以区分图上的黄色节点和绿色节点。 特征作为图的节点&#xff0c;颜色就是图的分类。 图的度的概念&#xff1a;与节点相连的条数。 邻接表记录的是后续邻居的信息&#xff1b; 在新闻推荐中&#xff0c;节点是…

2021年09月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;余数相同问题 已知三个正整数 a&#xff0c;b&#xff0c;c。 现有一个大于1的整数x&#xff0c;将其作为除数分别除a&#xff0c;b&#xff0c;c&#xff0c;得到的余数相同。 请问满足上述条件的x的最小值是多少? 数据保证x有解。 输入 一行&#xff0c;三…

微服务中间件--Nacos

Nacos 1. Nacos入门a.服务注册到Nacosb.Nacos服务分级存储模型c.NacosRule负载均衡d.服务实例的权重设置e.环境隔离 - namespacef.Nacos和Eureka的对比 2. Nacos配置管理a.统一配置管理b.配置热更新c.多环境配置共享 1. Nacos入门 Nacos是阿里巴巴的产品&#xff0c;现在是Spr…

【前端|JS实战第1篇】使用JS来实现属于自己的贪吃蛇游戏!

前言 贪吃蛇游戏是经典的小游戏&#xff0c;也是学习前端JS的一个很好的练习项目。在本教程中&#xff0c;我们将使用 JavaScript 来逐步构建一个贪吃蛇游戏。我们会从创建游戏区域开始&#xff0c;逐步添加蛇的移动、食物的生成以及游戏逻辑等功能。 &#x1f680; 作者简介&a…

tcl学习之路(五)(Vivado时序约束)

1.主时钟约束 主时钟通常是FPGA器件外部的板机时钟或FPGA的高速收发器输出数据的同步恢复时钟信号等。下面这句语法大家一定不会陌生。该语句用于对主时钟的名称、周期、占空比以及对应物理引脚进行约束。 create_clock -name <clock_name> -periood <period> -wa…

电影《孤注一掷》感触、计算机底层二进制与十进制的转换

今天&#xff0c;我与媳妇一同在商场吃完午餐&#xff0c;正值天空绵绵细雨。近期&#xff0c;听闻一部名为《孤注一掷》的电影&#xff0c;其主人公是一位程序员&#xff0c;故事情节围绕境外电信诈骗展开&#xff0c;引发了广泛的关注。身为一名程序员&#xff0c;我对与电信…

DSO 系列文章(2)——DSO点帧管理策略

文章目录 1.点所构成的残差Residual的管理1.1.前端残差的状态1.2.后端点的残差的状态1.3.点的某个残差的删除 2.点Point的管理2.1.如何删除点——点Point的删除2.2.边缘化时删除哪些点&#xff1f; 3.帧FrameHessian的管理 DSO代码注释&#xff1a;https://github.com/Cc19245/…

Vulnhub: DriftingBlues: 2靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.207 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.207 80端口的/blog目录为wordpress wpscan收集wordpress用户和爆破密码 wpscan --url http://driftingblues.box/blog -e…

深入理解Linux内核--回收页框

页框回收算法 Linux中有一点很有意思&#xff0c;在为用户态进程与内核分配动态内存时&#xff0c;所作的检查是马马虎虎的。 比如&#xff0c;对单个用户所创建进程的RAM使用总量并不作严格检查(第三章的“进程资源限制”一节提到的限制只针对单个进程); 对内核使用的许多磁盘…

【数据结构】链表的回文结构

文章目录 &#x1f30f;引言&#x1f9ed;[链表的回文结构](https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId49&&tqId29370&rp1&ru/activity/oj&qru/ta/2016test/question-ranking)&#x1f6a9;&#x1f6a9;题目描述&#xf…

学习网络编程No.3【socket理论实战】

引言&#xff1a; 北京时间&#xff1a;2023/8/12/15:32&#xff0c;自前天晚上更新完文章&#xff0c;看了一下鹅厂新出的《扫毒3》摆烂至现在&#xff0c;不知道是长大了&#xff0c;还是近年港片就那样&#xff0c;给我的感觉不是很好&#xff0c;也可能是国内市场对港片不…

XXL-JOB任务调度中心后台命令执行漏洞

漏洞描述 XXL-JOB任务调度中心后台存在命令执行漏洞,攻击者可在后台通过写入shell命令任务调度获取服务器控制权限 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权…

AndroidAGP8.1.0和JDK 17迁移之旅

AndroidAGP8.1.0和JDK 17迁移之旅 前言&#xff1a; 由于我最近写demo的直接把之前的项目从AGP4.2.2升级到8.1.0引发了一些列问题&#xff0c;这里记录一下&#xff0c;前面讲解过迁移DSL方式遇到的问题&#xff0c;这次升级8.1.0也比之前顺利多了&#xff0c;想看DSL迁移的可…

Edge浏览器免费使用GPT3.5

搜索sider,安装Sidebar插件 注册账号即可每天免费使用30次。 Sider: ChatGPT侧边栏,GPT-4, 联网, 绘图

Excel VBA 复制除指定工作表外所有的工作表的内容到一张工作表中

当我们有一张表里面有很多sheet 具有相同的表结构&#xff0c;如果需要汇总到一张表中&#xff0c;那么我们可以借助VBA 去实现汇总自动化 Sub 复制所有工作表内容()Dim ws As WorksheetDim targetSheet As WorksheetDim lastRow As Long 设置目标表格&#xff0c;即要将所有…