首页 > 编程语言 >C++设计模式---迭代器模式

C++设计模式---迭代器模式

时间:2024-07-05 11:02:36浏览次数:19  
标签:current 聚合 Iterator 迭代 C++ --- override 设计模式 public

1、介绍

        迭代器模式是⼀种行为型设计模式,是⼀种使⽤频率⾮常⾼的设计模式,在各个语⾔中都有应用,其主要⽬的是提供⼀种统⼀的⽅式来访问⼀个聚合对象中的各个元素,而不需要暴露该对象的内部表示。通过迭代器,客户端可以顺序访问聚合对象的元素,而无需了解底层数据结构。

        迭代器模式应⽤⼴泛,但是⼤多数语⾔都已经内置了迭代器接⼝,不需要⾃⼰实现。

包含一下几个部分:

        (1)迭代器接口Iterator :定义访问和遍历元素的接⼝, 通常会包括hasNext() ⽅法⽤于检查是否还有下⼀个元素,以及next() ⽅法⽤于获取下⼀个元素。有的还会实现获取第⼀个元素以及获取当前元素的⽅法。
        (2)具体迭代器ConcreateIterator :实现迭代器接⼝,实现遍历逻辑对聚合对象进⾏遍历。
        (3)抽象聚合类:定义了创建迭代器的接⼝,包括⼀个createIterator ⽅法⽤于创建⼀个迭代器对象。
        (4)具体聚合类:实现在抽象聚合类中声明的createIterator() ⽅法,返回⼀个与具体聚合对应的具体迭代器。

2、示例

#include <iostream>
#include <vector>

// 抽象迭代器类
class Iterator {
public:
    virtual void First() = 0;
    virtual void Next() = 0;
    virtual bool IsDone() = 0;
    virtual int CurrentItem() = 0;
};

// 具体迭代器类,用于遍历整数向量
class ConcreteIterator : public Iterator {
private:
    std::vector<int> *vec;
    int current;

public:
    ConcreteIterator(std::vector<int> *v) : vec(v), current(0) {}

    void First() override {
        current = 0;
    }

    void Next() override {
        if (current <= vec->size() - 1) {
            current++;
        }
    }

    bool IsDone() override {
        return current >= vec->size();
    }

    int CurrentItem() override {
        return (*vec)[current];
    }
};

// 聚合类
class Aggregate {
public:
    virtual Iterator *CreateIterator() = 0;
};

// 具体聚合类,即整数向量
class ConcreteAggregate : public Aggregate {
private:
    std::vector<int> items;

public:
    ConcreteAggregate() {
        items = {1, 2, 3, 4, 5};
    }

    Iterator *CreateIterator() override {
        return new ConcreteIterator(&items);
    }
};

int main() {
    ConcreteAggregate aggregate;
    Iterator *iterator = aggregate.CreateIterator();

    for (iterator->First(); !iterator->IsDone(); iterator->Next()) {
        std::cout << iterator->CurrentItem() << " ";
    }
    std::cout << std::endl;

    delete iterator;

    return 0;
}

结果:

1 2 3 4 5

标签:current,聚合,Iterator,迭代,C++,---,override,设计模式,public
From: https://blog.csdn.net/qq_34486832/article/details/140134729

相关文章

  • 游戏AI的创造思路-技术基础-计算机视觉
    让游戏的AI具备“眼睛”和“视觉”,就是通过计算机视觉的方法进行的。现在,越来越多的游戏,特别是动捕类游戏都在使用这个方法。当然,计算机视觉不仅仅用于游戏,越来越多的应用使用到这个技术目录1.定义2.发展历史3.公式和函数3.1.图像处理基础公式3.1.1.灰度化公式3.......
  • 游戏AI的创造思路-技术基础-自然语言处理
    自然语言处理-可以对游戏AI特别是RPG类、语言类游戏进行“附魔”,开发出“随机应变”和你聊天的“女友”、“队友”或者是根据你定义的文本库来用接近自然语言的生成“语言”,推动游戏情景在受控范围内前进目录1.自然语言处理定义2.发展历史3.计算方法和计算公式3.1.隐......
  • C++ 空间和时间高效的二项式系数(Space and time efficient Binomial Coefficient)
    这里函数采用两个参数n和k,并返回二项式系数C(n,k)的值。 例子: 输入:n=4和k=2输出:6解释:4C2等于4!/(2!*2!)=6输入:n=5和k=2输出:10解释:5C2等于5!/(3!*2!)=10        在本文中,我们讨论了O(n*k)时间和O(k)额外空间算法。C(n,......
  • HCIA知识点<5>--Vlan:虚拟局域网
    前言前面我们介绍了静态路由与动态路由,今天我们来讲一下如何使一个路由器接口完成多个路由器接口的工作...在交换机和路由器在协同工作后,将原来的一个广播域在逻辑上,切分为多个虚拟的广播域。[SW1]displayvlan 查看vlan1.VID----VlanID   用来区分和标定不同的vl......
  • BACON: Supercharge Your VLM with Bag-of-Concept Graph to Mitigate Hallucinations
    目录概BACON代码[YangZ.,FengR.,etal.BACON:Superchargeyourvlmwithbag-of-conceptgraphtomitigatehallucinations.2024.]概本文提出了一种新的数据格式:BACON(BAg-of-Conceptgraph).BACONBACON希望将一个图片转换为\(G=(D,O,R,B)\)的数据格式......
  • 一起来找bug茬-01
    /***@description对HttpServletRequest请求的数据进行转义,防止xss攻击*URL:home.html?mothod=space&pid=335511*/publicclassXssHttpServletRequestWrapperextendsHttpServletRequestWrapper{privatebyte[]body;publicXssHttpServletRequestWrapper(......
  • vue多个el-popover使用(打开不卡顿,可正常关闭)
    最近写vue遇到了点问题同页面多个el-popover打开卡顿问题、无法关闭问题解决方案,组件化封装el-popover组件模板定义<template><divclass="screen"><el-popover:placement="placement":width="screenWidth"trigger="c......
  • FHQ treap(再见splay------)
    但凡打过平衡树的应该都知道\(\huge{二逼平衡树}\)这道题,抄了两个小时的splay版题解,然后发现了\(\color{maroon}FHQtreap\):$\large\color{green}这是splay$structjjtree{ inlinevoidup(rintx){sz[x]=sz[son[x][0]]+sz[son[x][1]]+cnt[x];} inlineboolso(rintx){retu......
  • 邮件显示统计图表echarts-java+phantomjs实现
    邮件显示统计图表echarts-java+phantomjs实现项目背景是产品业务上的订阅推送,纯java后端实现,通过邮件将统计报表发送给用户。这里会涉及一些关键点:首先是统计图表的生成,我们采用常见的echarts,简单易用,支持图表类型丰富美观;java后端实现可使用echarts-java来实现图表的生成......
  • ESP32驱动TTP224触摸模块控制RGB灯亮灭---MircoPthon
    本文将指导读者如何使用Python编程ESP32微控制器,结合TT224触摸模块,实现对RGBLED灯的智能控制。通过详细的步骤和代码示例,读者可以快速搭建起自己的智能RGB灯控制系统。1.引言ESP32是由乐鑫科技(EspressifSystems)开发的一种为控制器,它具有以下主要特性:       ......