C++ 設計模式之迭代器模式

C++ 設計模式之迭代器模式

簡介

1、迭代器模式(Iterator)是一種行為型設計模式,它允許我們順序訪問一個聚合對象中的各個元素,而又不暴露該對象的內部表示。迭代器模式提供了一種方法來遍歷容器(容器對象,如列表、集合等)中的元素,而不需要了解容器底層的表示。

2、迭代器模式 (Iterator)應用場景包括但不限于:
2.1、當你的集合具有復雜的數據結構,并且你希望對客戶代碼隱藏其復雜性時。
2.2、當你需要一個遍歷的聚合對象,而且你希望有多種不同遍歷的方式時。

3、迭代器模式 (Iterator)的構成
3.1、迭代器接口(Iterator):定義訪問和遍歷元素的接口。

template<typename T>
class Iterator
{
public:virtual ~Iterator() {};virtual bool hasNext() const = 0;virtual T next() = 0;
};

3.2、具體迭代器(Concrete Iterator):實現迭代器接口,并跟蹤遍歷具體對象中的當前位置。

template<typename T>
class ConcreteAggregate
{
public:void add(T value);// 返回迭代器對象指針的嵌套類定義(具體迭代器)class IteratorImpl : public Iterator<T>{public:IteratorImpl(ConcreteAggregate& collection);T next();bool hasNext() const;private:ConcreteAggregate& collection;int current;};Iterator<T>* createIterator();
private:std::vector<T> data;
};

4、迭代器模式 (Iterator)的優點
4.1、支持不同的遍歷策略:可以自定義迭代器適應不同的數據結構和遍歷策略。
4.2、簡化集合接口:將遍歷邏輯從集合中抽離出來,集合本身的接口和實現都被簡化了。
4.3、同時在不同的集合上遍歷:一個集合可以有多個迭代器同時在不同位置進行遍歷。
4.4、同一抽象的多個實現:可以為不同的集合結構提供一個共同的迭代器接口。

5、迭代器模式 (Iterator)的缺點
5.1、可能不必要:對于一些簡單的集合操作,使用迭代器可能看起來是“過度設計”。
5.2、性能問題:創建額外的對象和調用方法可能會影響遍歷的性能。

簡單示例

1、定義

// 迭代器接口
template<typename T>
class Iterator
{
public:virtual ~Iterator() {};virtual bool hasNext() const = 0;virtual T next() = 0;
};// 具體集合
template<typename T>
class ConcreteAggregate
{
public:void add(T value);// 返回迭代器對象指針的嵌套類定義(具體迭代器)class IteratorImpl : public Iterator<T>{public:IteratorImpl(ConcreteAggregate& collection);T next();bool hasNext() const;private:ConcreteAggregate& collection;int current;};Iterator<T>* createIterator();
private:std::vector<T> data;
};

2、實現

template class ConcreteAggregate<int>; // 顯示實例化模板,裝載其他類型會編譯報錯,實際項目應將模板函數定義和實現放一起template<typename T>
void ConcreteAggregate<T>::add(T value)
{data.push_back(value);
}template<typename T>
Iterator<T>* ConcreteAggregate<T>::createIterator()
{return new IteratorImpl(*this);
}template<typename T>
ConcreteAggregate<T>::IteratorImpl::IteratorImpl(ConcreteAggregate& collection) : collection(collection), current(0)
{}template<typename T>
T ConcreteAggregate<T>::IteratorImpl::next()
{if (!hasNext()){throw std::out_of_range("Iterator out of range");}return collection.data[current++];
}template<typename T>
bool ConcreteAggregate<T>::IteratorImpl::hasNext() const
{return current < collection.data.size();
}

3、調用

ConcreteAggregate<int> collection;
collection.add(1);
collection.add(2);
collection.add(3);
collection.add(4);
auto it = collection.createIterator();
while (it->hasNext())
{std::cout << it->next() << std::endl;
}
delete it;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38125.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38125.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38125.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Configure C/C++ debugging

Configure C/C debugging launch.json 文件用于在 Visual Studio Code 中配置調試器。 Visual Studio Code 會生成一個 launch.json (位于項目的 .vscode 文件夾下),其中幾乎包含了所有必需的信息。要開始調試,您需要填寫 program 字段,指定要調試的可執行文件的路徑。這必須…

如何通過流式渲染提升用戶體驗?

什么是流式渲染&#xff1f; 流式渲染的核心理念是將 HTML 文檔分割成小塊&#xff08;chunk&#xff09;&#xff0c;并逐步地發送給客戶端&#xff0c;而非等待整個頁面完整生成后再進行傳輸。這種方式能夠極大地提升用戶的初始加載體驗&#xff0c;特別是在網絡條件不佳或者…

【從零開始學架構 架構基礎】四 架構設計的復雜度來源:可擴展性復雜度來源

架構設計的復雜度來源其實就是架構設計要解決的問題&#xff0c;主要有如下幾個&#xff1a;高性能、高可用、可擴展、低成本、安全、規模。復雜度的關鍵&#xff0c;就是新舊技術之間不是完全的替代關系&#xff0c;有交叉&#xff0c;有各自的特點&#xff0c;所以才需要具體…

新書速覽|Linux C與C++一線開發實踐

《Linux C與C一線開發實踐》 本書內容 Linux C/C編程在Linux應用程序開發中占有重要的地位&#xff0c;掌握這項技術將在就業競爭中立于不敗之地。《Linux C與C一線開發實踐》內容針對初中級讀者&#xff0c;貼近軟件公司一線開發實踐。全書厚達620多頁&#xff0c;知識點豐富…

Java中String和StringBuilder的區別

當然可以&#xff0c;我們可以通過面試問答的形式來探討String和StringBuilder的區別。 面試官&#xff1a;請解釋一下Java中String和StringBuilder的區別。 面試回答&#xff1a; 1. 不可變性&#xff08;Immutability&#xff09; String&#xff1a;String對象是不可變的…

微信小程序添加點擊事件

在微信小程序中&#xff0c;給<view>組件添加點擊事件非常直接&#xff0c;你可以使用bindtap屬性來綁定一個事件處理函數。下面是添加點擊事件的基本步驟和示例代碼&#xff1a; 步驟&#xff1a; 在WXML文件中&#xff1a;給需要添加點擊事件的<view>標簽添加bi…

第六周周報

摘要 本周重點跟著網課學習了pytorch框架下張量的各種常用操作API&#xff0c;為后面跑模型做準備&#xff0c;因為看的視頻比較偏向原理&#xff0c;現在對張量有了一個新的認識。其次在時序的研究上&#xff0c;最近我在看圖神經網絡跟時序結合的方向&#xff0c;所以本周學…

Qt自定義類型

概述 在使用Qt創建用戶界面時&#xff0c;特別是那些具有特殊控件和特性的界面時&#xff0c;開發人員有時需要創建新的數據類型&#xff0c;以便與Qt現有的值類型集一起使用或代替它們。 QSize、QColor和QString等標準類型都可以存儲在QVariant對象中&#xff0c;作為基于qo…

51單片機第6步_stdlib.h庫函數

本章重點學習stdlib.h庫函數。 #include <REG51.h> //包含頭文件REG51.h,使能51內部寄存器; #include <stdlib.h> //float atof (char *s1); //參數s1字符串可包含正負號,小數點或E(e)來表示指數部分,如123.456或123e-2; //若首字符是非數據字符,或為正負號…

es6語法復習一

es6語法 1.var 變量提升 2.let 不存在變量提升&#xff0c;只能定義一次 3.const 先定義再使用&#xff0c;定義好來不能修改 4.解構賦值 [a,b,c][1,2,3],{a,b,c}{a:1,b:2,c:3} 5.模版字符串 let aaa; ${a} is ok 6.對象簡化寫法 const school{ name, change, improve(){ cons…

力扣2438.二的冪數組中查詢范圍內的乘積

力扣2438.二的冪數組中查詢范圍內的乘積 lowbit求所有2的冪 accumulate函數(begin,end,start,way)求和/積的方式求積并取模 const int N 1e9 7;class Solution {public:int lowbit(int x){return x & -x;}vector<int> productQueries(int n, vector<vector&l…

[NSSCTF]-Reverse:[SWPUCTF 2021 新生賽]easyapp(安卓逆向,異或)

無殼 把后綴名改為zip&#xff0c;找到apk 查看jadx 這里調用了MainActivity的lambda$onCreate$0$MainActivity&#xff0c;然后又調用了Encoder進行異或。 exp&#xff1a; result棿棢棢棲棥棷棊棐棁棚棨棨棵棢棌 key987654321 flag for i in range(len(result)):flagchr(…

HarmonyOS開發:應用完整性校驗

簡介 為了確保應用的完整性和來源可靠&#xff0c;OpenHarmony需要對應用進行簽名和驗簽。 應用開發階段&#xff1a; 開發者完成開發并生成安裝包后&#xff0c;需要開發者對安裝包進行簽名&#xff0c;以證明安裝包發布到設備的過程中沒有被篡改。OpenHarmony的應用完整性校…

Foxit Reader與PDF交互性:探索高級功能

引言 PDF&#xff08;Portable Document Format&#xff09;文件格式以其跨平臺的一致性和豐富的多媒體支持而廣受歡迎。Foxit Reader作為一款功能全面的PDF閱讀器&#xff0c;不僅提供了基本的查看和導航功能&#xff0c;還支持PDF文件中的多種交互式元素。本文將深入探討Fox…

SQL Server中 MERGE 語句

在 SQL Server 中,MERGE 語句用于根據兩個表之間的條件來插入、更新或刪除記錄。它通常用于同步兩個表的數據,其中一個表是源表(包含要插入或更新的數據),另一個是目標表(數據要插入或更新的表)。 1、本文內容 語法參數備注觸發器的實現權限有關索引的最佳做法MERGE 的…

探索sklearn的貝葉斯奧秘:樸素貝葉斯分類器全解析

&#x1f680; 探索sklearn的貝葉斯奧秘&#xff1a;樸素貝葉斯分類器全解析 樸素貝葉斯分類器是一類基于貝葉斯定理的簡單概率分類器&#xff0c;它們在文本分類、垃圾郵件識別等領域表現出色。在Python的sklearn庫中&#xff0c;樸素貝葉斯分類器以其實現簡單和效率高效而受…

關于響應式編程的理解與SpringCloudGateway的理解

關于響應式編程的理解與SpringCloudGateway的理解 一. 響應式編程與函數式編程的區別二. 響應式編程中常用的組件2.1 RxJava定義2.2 Rxjava基本概念2.3 RxJava 用法 三 SpringcloudGateway四 常見的四種限流規則 一. 響應式編程與函數式編程的區別 總的來說&#xff0c;響應式編…

qt中的枚舉值-QMetaEnum

QMetaEnum 測試代碼hcpp 講解 測試代碼 h #include <QMainWindow> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~M…

GPIO和PIN

文章目錄 1 GPIO和Pin1.1 GPIO和Pin基礎概念1.2 GPIO輸入模式1.3 GPIO輸出模式1.4 GPIO的HAL庫1.4.1 一些HAL庫表示1.4.2 HAL庫常用GPIO函數1.4.3 GPIO點亮led燈程序例子 1 GPIO和Pin 1.1 GPIO和Pin基礎概念 ? 單片機有很多的引腳&#xff0c;為了操控每一個引腳&#xff0c…

grpc學習golang版( 四、多服務示例 )

系列文章目錄 第一章 grpc基本概念與安裝 第二章 grpc入門示例 第三章 proto文件數據類型 第四章 多服務示例 第五章 多proto文件示例 第六章 服務器流式傳輸 第七章 客戶端流式傳輸 第八章 雙向流示例 文章目錄 一、前言二、定義proto文件三、編寫server服務端四、編寫Client客…