slist 的实现
slist单向链表的实现,比较复杂,运用了继承关系;
slist前者的迭代器属于单向的Foward Iterator。单向链表所耗用的空间更小,某些操作更快;
slist没有方法可以返回前一个位置,必须从头开始找起。所以,除了slist起点附近的区域之外,在其它位置上采用insert或erase操作函数,都是不智之举;slist提供了insert_after()和erase_after();
基于效率考虑,slist不提供push_back(),只提供push_front().
__________________________________________________________________________________________________
slist的节点
//单向链表节点的基本结构
struct _Slist_node_base
{
_Slist_node_base* _M_next;
};
//单向链表的节点结构
template <class _Tp>
struct _Slist_node : public _Slist_node_base
{
_Tp _M_data;
};
//make_link,在pre_node之后插入以新节点
inline _Slist_node_base*
__slist_make_link(_Slist_node_base* __prev_node,
_Slist_node_base* __new_node)
{
__new_node->_M_next = __prev_node->_M_next;
__prev_node->_M_next = __new_node;
return __new_node;
}
//计算slist的节点个数
inline size_t __slist_size(_Slist_node_base* __node)
{
size_t __result = 0;
for ( ; __node != 0; __node = __node->_M_next)
++__result;
return __result;
}
//查找节点node之前的元素节点
inline _Slist_node_base*
__slist_previous(_Slist_node_base* __head,
const _Slist_node_base* __node)
{
while (__head && __head->_M_next != __node)
__head = __head->_M_next;
return __head;
}
inline const _Slist_node_base*
__slist_previous( const _Slist_node_base* __head,
const _Slist_node_base* __node)
{
while (__head && __head->_M_next != __node)
__head = __head->_M_next;
return __head;
}
__________________________________________________________________________________________________
slist的迭代器
//迭代器的基本结构
struct _Slist_iterator_base
{
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef forward_iterator_tag iterator_category;
_Slist_node_base* _M_node; //指向节点基本结构
_Slist_iterator_base(_Slist_node_base* __x) : _M_node(__x) {}
void _M_incr() { _M_node = _M_node->_M_next; }
bool operator==( const _Slist_iterator_base& __x) const {
return _M_node == __x._M_node;
}
bool operator!=( const _Slist_iterator_base& __x) const {
return _M_node != __x._M_node;
}
};
//单项链表迭代器结构
template <class _Tp, class _Ref, class _Ptr>
struct _Slist_iterator : public _Slist_iterator_base
{
typedef _Slist_iterator<_Tp, _Tp&, _Tp*> iterator;
typedef _Slist_iterator<_Tp, const _Tp&, const _Tp*> const_iterator;
typedef _Slist_iterator<_Tp, _Ref, _Ptr> _Self;
typedef _Tp value_type;
typedef _Ptr pointer;
typedef _Ref reference;
typedef _Slist_node<_Tp> _Node;
_Slist_iterator(_Node* __x) : _Slist_iterator_base(__x) {}
_Slist_iterator() : _Slist_iterator_base(0) {}
_Slist_iterator( const iterator& __x) : _Slist_iterator_base(__x._M_node) {}
reference operator *() const { return ((_Node*) _M_node)->_M_data; }
#ifndef __SGI_STL_NO_ARROW_OPERATOR
pointer operator ->() const { return &( operator*()); }
#endif /* __SGI_STL_NO_ARROW_OPERATOR */
//operator++,没有实现operator--,因为这是slist迭代器是Forward Iterator
_Self& operator ++()
{
_M_incr();
return * this;
}
_Self operator ++(int )
{
_Self __tmp = * this;
_M_incr();
return __tmp;
}
};
__________________________________________________________________________________________________
slist的数据结构

浙公网安备 33010602011771号