美文网首页设计模式 BY C++C++设计模式
C++ 设计模式 —— 16.迭代器模式

C++ 设计模式 —— 16.迭代器模式

作者: JeremyYv | 来源:发表于2019-12-28 16:55 被阅读0次
  • 迭代器模式:一种行为型设计模式

  • 应用场景:
    刚学习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

如有错误,欢迎指正

相关文章

网友评论

    本文标题:C++ 设计模式 —— 16.迭代器模式

    本文链接:https://www.haomeiwen.com/subject/klusoctx.html