【C++】list容器迭代器的模拟实现

发布时间:2024年01月22日

? ? ? ? list容器内部基本都是链表形式实现,这里的迭代器实现的逻辑需要注意C语言中指针的转换。

????????list容器如同数据结构中的队列,通常用链式结构进行存储。在这个容器中,我们可以模仿系统的逻辑,在头结点后设置一个“ 哨兵 ”,此结点前指头结点,后指尾结点,如下图:

? ? ? ? 为保可以装纳所有类型的数据,因此,这里我们需使用类模板,结点结构设置框架如下:

template<class T> //模板
struct ListNode
{
?? ?ListNode<T>* _next;? ?//指向前结点的指针
?? ?ListNode<T>* _last;? //指向后结点的指针
?? ?T _data;

? ??//因不确定数据类型,所以使用T类型的默认构造
?? ?ListNode(const T& x = T())
?? ??? ?:_next(nullptr)
?? ??? ?, _last(nullptr)
?? ??? ?, _data(x)
?? ?{ ?}
};

? ? ? ? 显然,迭代器也需使用类模板,这里要注意的是迭代器的构造函数,下面是模拟实现迭代器的构造函数,前置++(或--),后置++(或--),解引用操作,!=和==运算符重载的运用:

template<class T>
struct __list_iterator
{
?? ?typedef ListNode<T> Node; ?//类型结点
?? ?typedef __list_iterator<T> self; ?//类型迭代器
?? ?Node* _node; //结点

?? ?//构造函数

?? ?__list_iterator(Node* x)
?? ??? ?:_node(x)
?? ?{???}

?? ?// ++it,即后置++
?? ?self& operator++()
?? ?{
?? ??? ?_node = _node->_next;
?? ??? ?return *this;
?? ?}

?? ?// it++,即前置++
?? ?self operator++(int)
?? ?{
?? ??? ?self t(*this);

?? ??? ?_node = _node->_next;

?? ??? ?return t;
?? ?}

?? ?// --it,即后置--

?? ?self& operator--()
?? ?{
?? ??? ?_node = _node->_last;
?? ??? ?return *this;
?? ?}

?? ?// it--,即前置--

?? ?self operator--(int);
?? ?{
?? ??? ?self t(*this);
?? ??? ?_node = _node->_last;
?? ??? ?return t;
?? ?}

? ? //解引用,即访问结点中的数据

?? ?T& operator*()
?? ?{
?? ??? ?return _node->_data;
?? ?}

? ? //以下是运算符重载

?? ?bool operator!=(const self& s)
?? ?{
?? ??? ?return _node != s._node;
?? ?}

?? ?bool operator==(const self& s)
?? ?{
?? ??? ?return _node == s._node;
?? ?}
};

? ? ? ? 迭代器的目前其它初级功能实现与以上类似,这里就不在一一列举,后面会专门运用模拟迭代器的使用,这里先了解其语法和逻辑使用。

文章来源:https://blog.csdn.net/m0_74246469/article/details/135721815
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。