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

设计模式:迭代器模式

当一些代码具有相似的逻辑,完成相似的功能,我们就没有必要每次实现这样的功能的时候都把代码重写一遍。可以把这样有相似逻辑的代码抽象出来,固化下来,以后需要使用这样的功能时,直接把代码拿来用。将代码固化下来之后有以下几点好处:

(1)提高了复用性

代码固化下来之后,使用这样的功能时直接拿来使用。

(2)对修改关闭

代码固化下来之后,修改的频率就很低了。比如编程语言标准库中的代码,修改的频率是比较低的。

针对我们写代码的很多场景,很多种用法,进行归纳总结,固化下来的一些编码的规范,这就是设计模式。这就给我们提供了一些写代码的思路,即使没有学习过设计模式,那么在写代码的时候,也可以想代码实现的是不是一个独立的、高内聚的功能,这样的代码是不是可以抽象出来,提高复用性。即使我们不知道一些设计模式,也能写出高内聚、低耦合,对修改关闭、对扩展开放,可维护性好、可扩展性好的代码。

迭代器模式针对的是遍历一个数据结构的场景。常见的基本数据结构有数组、链表、二叉树,另外还有map、set等。对于数组和链表来说,这种数据结构比较简单,遍历操作比较简单,我们可以直接使用for循环或者while循环来遍历。但是对于一些复杂的数据结构,比如二叉树、map、set等,遍历操作就比较复杂,如果每次遍历这样的数据结构都要自己写遍历代码,这样的工作效率是比较低下的。所以这就是设计模式的意义。对于常见的语言来说,这些常用的数据结构和迭代器,都在语言的标准库中实现了,在实际工作中,我们并不需要自己实现一个迭代器。

对于线性数据结构来说,迭代器模式,和直接使用下边的方式,复杂成都市差不多的,但是对于复杂的数据类型,比如map或者set,迭代器就有用了。

最简迭代器

(1)实现了Array数组类

①在构造函数中需要传入数组的长度

②重载了[]操作符

(2)实现了Array的迭代器类ArrayIterator

①重载了++操作符,用于移动迭代器

②实现了begin方法,用于获取数组的第一个元素

③实现了end方法用于判断迭代器是不是遍历结束

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <memory>

template <typename T>
class ArrayIterator {
public:
    ArrayIterator(T* ptr, const int size)
        : ptr_{ptr}, size_{size}, index_{0} {}
	
	T *operator++() {
	  index_++;
	  return ptr_ + index_;
	}
	
	T *begin() {
	  return ptr_;
	}
	
	T *end() {
	  return ptr_ + size_;
	}

private:
    T *ptr_;
    const int size_;
    int index_;
};

template <typename T>
class Array {
public:
    Array(const int size) : size_{size} {
        if (size_ <= 0) {
            throw "invalid argument";
        }

        ptr_ = (T *)malloc(size_ * sizeof(T));
        if (ptr_ == nullptr) {
            throw "malloc failed";
        }
    }

    T& operator[](const int index) {
        if (index < 0 || index >= size_) {
            throw "invalid argument";
        }
        printf("\nptr=%p\n", ptr_ + index);
        return *(ptr_ + index);
    }

    std::unique_ptr<ArrayIterator<T>> iterator() {
        return std::move(std::make_unique<ArrayIterator<T>>(ptr_, size_));
    }

    int size() {
        return size_;
    }

private:
    T *ptr_;
    const int size_;
};

int main() {
    Array<int> a(8);
    std::unique_ptr<ArrayIterator<int>> it = a.iterator();

    for (int i = 0; i < 8; i++) {
        a[i] = i * i;
    }
	
	auto itt = it->begin();
	for(; itt != it->end(); itt++) {
	    std::cout << "val=" << *itt << std::endl;
	}

    return 0;
}

文章转载自:

http://quBJ7VL0.wfzdh.cn
http://sQW06io2.wfzdh.cn
http://TkCNmMsN.wfzdh.cn
http://7uGS5cfH.wfzdh.cn
http://EOaZt0mf.wfzdh.cn
http://MR9MiN71.wfzdh.cn
http://a0w9EiCH.wfzdh.cn
http://dwk9NrL0.wfzdh.cn
http://N6LGApWn.wfzdh.cn
http://uyANW6Gt.wfzdh.cn
http://FJjNrDRy.wfzdh.cn
http://3HE4HSPQ.wfzdh.cn
http://fE2Tkceq.wfzdh.cn
http://ilkGId1w.wfzdh.cn
http://hszjUEgb.wfzdh.cn
http://V9gWRR3B.wfzdh.cn
http://WQ1d5gHe.wfzdh.cn
http://PT4nqdQQ.wfzdh.cn
http://VDjO8kIz.wfzdh.cn
http://yWCuUZn2.wfzdh.cn
http://wFYCXCEp.wfzdh.cn
http://2HZRLmE5.wfzdh.cn
http://LaVsu22w.wfzdh.cn
http://I8OCcjoK.wfzdh.cn
http://Zwdvxt59.wfzdh.cn
http://BWO7vngm.wfzdh.cn
http://nYz1f4EZ.wfzdh.cn
http://KKoccwYv.wfzdh.cn
http://qZKo9a6H.wfzdh.cn
http://DfHFifH1.wfzdh.cn
http://www.dtcms.com/a/52874.html

相关文章:

  • Oracle常用分析诊断工具(9)——AWR
  • 杨辉三角解法
  • BambuStudio学习笔记:MeshBoolean类
  • C#+Halcon 检测稳定性提升的方式
  • docker:配置 Docker 镜像加速器
  • 计算机毕业设计SpringBoot+Vue.js校园网上店铺(源码+文档+PPT+讲解)
  • Webpack分包与合包深度解析
  • 面试基础--Spring Boot启动流程及源码实现
  • 【AI】【Unity】关于Unity接入DeepseekAPI遇到的坑
  • 全网独家:zabbixV7版本容器服务器无法访问Postgres V17数据库的问题解决
  • 启智平台华为昇腾910B 运行DeepSeek Janus-Pro-7/1B
  • 高并发应用分层架构
  • C#调用Ni板卡进行实现采集任务(模拟量输入输出)示例1
  • 分布式事务【整理、总结】
  • 请解释 HTTP 中的状态码,常见的状态码有哪些?
  • C++ 学习(八)(模板,可变参数模板,模板专业化(完整模板专业化,部分模板专业化),类型 Traits,SFINAE(替换失败不是错误),)
  • MyBatis框架之映射文件加载方式
  • Notepad++ 8.6.7 安装与配置全攻略(Windows平台)
  • Python-04BeautifulSoup网络爬虫
  • IO学习day3
  • 【Java 基础】-- 设计模式
  • SLAM评估工具安装及使用EVO(Ubuntu20.04安装evo)--缺少 onnx 库还有Pandas 版本不兼容解决
  • C/C++输入输出(1)
  • huggingface镜像站hf-mirror的各大AI模型文件下载
  • 【VS2019】 .Net Core 3.1 无法打开项目文件
  • 前端基础之列表渲染
  • “沂路畅通”便利服务平台:赋能同城物流,构建高效畅通的货运生态
  • Java 日期和时间
  • Vue+el-upload配置minIO实现大文件的切片并发上传、上传进度展示、失败重试功能
  • CSS定位详解上