C++ 设计模式 —— 16.迭代器模式
2019-12-28 本文已影响0人
JeremyYv
-
迭代器模式:一种行为型设计模式
-
应用场景:
刚学习C++STL容器的时候,自然也学习了迭代器。当时很不懂为什么指针可以解决的问题,要封成一个表现和指针很类似的类,还起了个新名词叫迭代器。
后来对多种数据结构的应用渐渐有了了解之后,大致知道了迭代器的优点。
再后来学习到了迭代器模式,才懂得迭代器是一种思想,可以隐藏容器的内部实现细节,向使用者提供简单的方式进行容器内元素的迭代访问。 -
举例:
数组和链表,一个是连续内存,一个是非连续内存。在这两种数据结构中,对某个元素下一个元素的访问方式是不同的,数组可以通过将前一元素下标+1访问下一元素,而链表需要通过当前节点的Next指针获取下一元素的地址,再进行元素访问。
这样对用户来说体验是很不友好的。用户需要记住每种容器的迭代访问方式,大大降低了使用效率。
所以如果每种容器都能提供给用户统一的访问方式,就可以解决这个状况了,于是迭代器模式登场了。 -
实现方式:
每种容器在实现的同时,提供一个相对应的迭代器类。迭代器类中保存一个指针,指向链表中的某个节点,通过重载++
运算符,封装指针移向下一个节点的过程。
这样用户在想要访问容器内元素的时候,无需关注容器内部实现细节,只需通过迭代器对象,调用++
即可访问下一个元素了。
以下是迭代器模式的简单代码实现
#include <iostream>
using namespace std;
//自定义的节点
typedef struct Node
{
int iData;
struct Node* pNext;
}NODE;
//自定义的某种容器
class MyList
{
public:
MyList():m_pHead(NULL), m_pTail(NULL){}
//添加元素
void Add(int iNewData)
{
NODE* pNewNode = new Node();
pNewNode->iData = iNewData;
pNewNode->pNext = NULL;
if(NULL == m_pHead)
{
m_pHead = pNewNode;
m_pTail = m_pHead;
}
else
{
m_pTail->pNext = pNewNode;
m_pTail = m_pTail->pNext;
}
}
//获取头指针位置
Node* Begin()
{
return m_pHead;
}
//获取尾指针位置
Node* End()
{
return m_pTail->pNext;
}
private:
NODE* m_pHead;
NODE* m_pTail;
};
//自定义容器对应的迭代器类
class MyListIterator
{
public:
MyListIterator(Node* pNode = NULL)
{
m_pCurrentNode = pNode;
}
Node* operator=(Node* pNode)
{
m_pCurrentNode = pNode;
return m_pCurrentNode;
}
int operator*()
{
return m_pCurrentNode->iData;
}
MyListIterator& operator++()
{
m_pCurrentNode = m_pCurrentNode->pNext;
return *this;
}
private:
NODE* m_pCurrentNode;
};
主函数中的使用
int main()
{
//先向自定义容器中填充数据
MyList oList;
oList.Add(1);
oList.Add(2);
//访问并输出
MyListIterator oIterator = oList.Begin();
cout << *oIterator << endl;
++oIterator;
cout << *oIterator << endl;
return 0;
}
控制台输出结果
1
2
如有错误,欢迎指正