《C++新经典设计模式》之第10章 迭代器模式

《C++新经典设计模式》之第10章 迭代器模式

        • 迭代器模式.cpp

迭代器模式.cpp
#include <iostream>
#include <vector>
#include <list>
#include <memory>
using namespace std;// 遍历容器中的元素
// 迭代器单独实现为类模板,与容器模板解耦
// 提供一种方法顺序访问一个聚合对象(容器)中各个元素,而又不暴露该对象的内部表示(实现代码)// 4种角色
// Iterator(抽象迭代器),定义访问和遍历容器中元素的接口
// ConcreteIterator(具体迭代器),具体遍历聚合对象(容器)中元素,记录当前元素位置
// Aggregate(抽象聚合),容器,存储和管理元素对象,声明CreateIterator方法创建迭代器对象,充当创建迭代器的工厂角色
// ConcreteAggregate(具体聚合),返回ConcreteIterator实例// 单一职责原则
// 一个类的职责应该单一,只做一件事情或者对外只提供一种功能// 内聚性,功能角度度量模块或类内部组成部分彼此结合紧密程度
// 耦合性,模块间相互关联程度。
// 内容耦合,一个模块直接修改或操作另一个模块的数据
// 公共耦合,多个模块共同引用全局数据项
// 外部耦合,一组模块不是通过参数表访问同一全局简单变量
// 控制耦合,一个模块通过控制信号(传送开关、标志、名字等控制信息),明显地控制另一个模块的功能
// 标记耦合,两个模块间传递数据结构地址
// 数据耦合,模块间通过参数传递数据// 高类聚、低耦合namespace ns1
{template <typename T> // 抽象迭代器类模板class myIter{public:virtual ~myIter() {}virtual void First() = 0;     // 指向容器中第一个元素virtual void Next() = 0;      // 指向下一个元素virtual bool IsDone() = 0;    // 是否遍历完virtual T &CurrentItem() = 0; // 获取当前的元素};template <typename T> // 抽象容器类模板class myCotainer{public:virtual ~myCotainer() {}// virtual myIter<T> *CreateIterator() = 0; // 创建迭代器virtual shared_ptr<myIter<T>> CreateIterator() = 0; // 创建迭代器virtual T &getItem(int index) = 0;                  // 获取当前元素virtual int getSize() const = 0;                    // 容器中元素数量};template <typename T> // 具体迭代器类模板,针对10元素数组class myVectorIter : public myIter<T>{myCotainer<T> *myvector;int m_current; // 记录数组的当前下标(迭代器在当前容器中的位置)public:myVectorIter(myCotainer<T> *tmpc) : myvector(tmpc), m_current(0) {}void First() override { m_current = 0; } // 容器(数组)中的第一个元素下标为0void Next() override { m_current++; }    // 下标+1,意味着数组中的下一个元素bool IsDone() override { return m_current >= myvector->getSize(); }T &CurrentItem() override { return myvector->getItem(m_current); }};template <typename T> // 具体容器类模板class myVector : public myCotainer<T>{private:T m_elem[10]; // 固定10元素数组public:myVector(){for (int i = 0; i < 10; ++i)m_elem[i] = i;}// myIter<T> *CreateIterator() override { return new myVectorIter<T>(this); }shared_ptr<myIter<T>> CreateIterator() override { return make_shared<myVectorIter<T>>(this); }T &getItem(int index) override { return m_elem[index]; }int getSize() const override { return 10; }};
}int main()
{
#if 0vector<int> msgVector;msgVector.push_back(1); // 末尾插入1,vector中内容:1msgVector.push_back(2); // 末尾插入2,vector中内容:1,2msgVector.push_back(3); // 末尾插入3,vector中内容:1,2,3for (vector<int>::const_iterator pos = msgVector.cbegin(); pos != msgVector.cend(); ++pos)cout << *pos << endl;cout << "-------------------" << endl;list<int> msgList;msgList.push_back(1);  // 末尾插入1,list中内容:1msgList.push_front(2); // 开头插入2,list中内容:2,1msgList.push_back(3);  // 末尾插入3,list中内容:2,1,3for (list<int>::const_iterator pos = msgList.cbegin(); pos != msgList.cend(); ++pos)cout << *pos << endl;
#endif#if 0using namespace ns1;shared_ptr<myCotainer<int>> pcontainer(new myVector<int>());shared_ptr<myIter<int>> iter(pcontainer->CreateIterator());// 遍历容器中的元素for (iter->First(); !iter->IsDone(); iter->Next()) // 多态机制的遍历,效率上不好,尽量考虑栈机制cout << iter->CurrentItem() << endl;
#endif#if 1using namespace ns1;shared_ptr<myCotainer<int>> pcontainer(new myVector<int>());myVectorIter<int> iter(pcontainer.get());// 遍历容器中的元素for (iter.First(); !iter.IsDone(); iter.Next()) // 非多态机制,可以明显改善程序性能cout << iter.CurrentItem() << endl;
#endifcout << "Over!\n";return 0;
}

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

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

相关文章

TypeScript 第三节:变量声明

一、命名规则 TypeScript 变量的命名规则与 JavaScript 一致&#xff0c;具体如下&#xff1a; 变量名必须以字母、下划线或美元符号&#xff08;$&#xff09;开头&#xff1b;变量名可以包含字母、数字、下划线或美元符号&#xff08;$&#xff09;&#xff1b;变量名区分大小…

数据库字段名和sql关键字冲突报错解决方法

1、修改实体类字段映射。注解里加反引号 2、sql字段上加反引号 3、问题解决

synchronized关键字的用法

synchronized关键字的用法 1、class monitor public synchronized static void staticSync()synchronized (ClassMonitor.class)2、this monitor public synchronized void sync()synchronized (this)3、monitor private final Object object new Object(); synchronized (…

class类实现operator==重载

利用 operator实现重载&#xff0c;实现两个类进行比较 1.不带参数的函数 #include <iostream> #include <string> using namespace std;class Person // 1.定义一个类 { public:Person(string name, int age){this->name name;this->age age;…

ue5材质预览界面ue 变黑

发现在5.2和5.1上都有这个bug 原因是开了ray tracing引起的&#xff0c;这个bug真是长时间存在&#xff0c;类似的bug还包括草地上奇怪的影子和地形上的影子等等 解决方法也很简单&#xff0c;就是关闭光追&#xff08;不是…… 就是关闭预览&#xff0c;在材质界面preview sc…

C# WPF上位机开发(会员充值软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在软件开发中&#xff0c;有一种很重要的控件&#xff0c;那就是表格。大家可以想象下&#xff0c;办公软件里面是不是就有一个专门做表格的软件&a…

路由器的转换原理--ENSP实验

目录 一、路由器的工作原理 二、路由表的形成 1、直连路由 2、非直连路由 2.1静态路由 2.2动态路由 三、静态路由和默认路由 1、静态路由 1.1静态路由的缺点 1.2路由的配置--结合ensp实验 2、默认路由--特殊的静态路由 2.1概念 2.2格式 2.3默认路由的配置--ens…

本地部署语音转文字(whisper,SpeechRecognition)

本地部署语音转文字 1.whisper1.首先安装Chocolatey2.安装3.使用 2.SpeechRecognition1.环境2.中文包3.格式转化4.运行 3.效果 1.whisper 1.首先安装Chocolatey https://github.com/openai/whisper 以管理员身份运行PowerShell Set-ExecutionPolicy Bypass -Scope Process -…

LeetCode刷题--- 二叉树剪枝

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏&#xff1a;http://t.csdnimg.cn/ZxuNL http://t.csdnimg.cn/c9twt 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#xff0c;所以下面题目主要也是这些算法做的 我讲述…

NFTScan | 12.04~12.10 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2023.12.04~ 2023.12.10 NFT Hot News 01/ NFTScan 与 MintCore 联合推出适用于 NFT 的 Layer2 网络 Mint 12 月 5 日&#xff0c;根据官方消息&#xff0c;NFT 基础设施服务商 NFTScan …

NFC物联网解决方案应用实例:基于NFC的通用物流链防伪溯源

NFC物联网系统解决方案已在某局进行推广应用&#xff0c;给出了某省内出口蔬菜水果检验检疫监管的物联网解决方案。 依据相关法规&#xff0c;出口蔬菜必须在质检总局注册种植基地进行种植&#xff0c;出口前按批次向产地检验检疫部门进行申报&#xff0c;按时在集中监管区统一…

Python+selenium自动化生成测试报告

前言 批量执行完用例后&#xff0c;生成的测试报告是文本形式的&#xff0c;不够直观&#xff0c;为了更好的展示测试报告&#xff0c;最好是生成HTML格式的。 unittest里面是不能生成html格式报告的&#xff0c;需要导入一个第三方的模块&#xff1a;HTMLTestRunner 一、导…

SpringBoot系列之基于Jedis实现分布式锁

Redis系列之基于Jedis实现分布式锁 1、为什么需要分布式锁 在单机环境&#xff0c;我们使用最多的是juc包里的单机锁&#xff0c;但是随着微服务分布式项目的普及&#xff0c;juc里的锁是不能控制分布锁环境的线程安全的&#xff0c;因为单机锁只能控制同个进程里的线程安全&…

Java实现选择排序及其动图演示

选择排序是一种简单直观的排序算法。它的基本思想是每次从未排序的元素中选出最小&#xff08;或最大&#xff09;的元素&#xff0c;然后将其放到已排序的序列的末尾。具体步骤如下&#xff1a; 首先&#xff0c;找到未排序序列中的最小&#xff08;或最大&#xff09;元素&a…

PyInstaller 打包 Python 脚本为 .exe 可执行文件闪退、No Model named XXX问题

文章目录 前言.exe 可执行文件闪退No Model named XXXPython 环境问题查看当前python路径查看当前python环境使用的site-package路径 个人简介 前言 在上一篇文章中&#xff0c;我们介绍了如何将 Python 脚本打包为 .exe 可执行文件&#xff0c;但有时候打包生成的 .exe 文件会…

记录hive/spark取最新且不为null的方法

听标题可能听不懂我想表达的意思&#xff0c;我来描述一下我要做的事&#xff1a; 比如采集同学对某一网站进行数据采集&#xff0c;同一个用户每天会有很多条记录&#xff0c;所以我们要取一条这个用户最新的状态&#xff0c;比如用户改了N次昵称&#xff0c;我们只想得到最后…

MATLAB代码:含电热联合系统的微电网运行优化

微♥关注“电击小子程高兴的MATLAB小屋”获取专属优惠 说明书 MATLAB代码&#xff1a;含电热联合系统的微电网运行优化 关键词&#xff1a;微网 电热联合系统 优化调度 参考文档&#xff1a;《含电热联合系统的微电网运行优化》完全复现 仿真平台&#xff1a;MATLAB yalmi…

2024年AI云计算专题研究报告:智算带来的变化

今天分享的人工智能系列深度研究报告&#xff1a;《2024年AI云计算专题研究报告&#xff1a;智算带来的变化》。 &#xff08;报告出品方&#xff1a;华泰证券&#xff09; 报告共计&#xff1a;32页 Al 云计算 2024:关注智算带来的新变化 通过对海内外主要云厂商及其产业链…

C# WPF上位机开发(日志调试)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 程序开发的过程中&#xff0c;调试肯定是少不了的。比如说&#xff0c;这个时候&#xff0c;我们可以设置断点、查看变量、检查函数调用堆栈等等。…

目标检测锚框

目标检测锚框 最开始呢&#xff0c;我们需要先介绍一下框&#xff0c;先学会一下怎么画框 导入所需要的包 from PIL import Image import d2lzh_pytorch as d2l import numpy as np import math import torch展示一下本次实验我们用到的图像&#xff0c;猫狗 d2l.set_figsiz…