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