4、list深度探索

list的数据结构

list不仅是一个双向链表,而且是一个环状的双向链表,因此它只需要一个指针,便可以完整的表现整个链表:

template 
class list{
protected:
	typedef __list_node list_node;
public:
	typedef list_node* link_type;
	typedef __list_iterator iterator;//所有的容器都要有这个typedef
protected:
	link_type node;//唯一的数据故list的大小只有一个指针即4
...
}

如果让node指针指向尾端的空白节点,node便能符合STL对于"前闭后开"区间的要求,如下图所示:

4、list深度探索_第1张图片

list的节点

list节点是一个双向链表的结构:

template
struct _list_node
{
	typedef void* void_pointer; // 使用void*的方法不算好
	void_pointer prev;
	void_pointer next;
	T data;
}

list迭代器

list指针不在像vector一样以普通指针作为迭代器,因为节点在存储空间中不连续。list迭代器必须有能力指向list的节点,并且能够正确的递增、递减、取值、成员取用等操作。所谓list迭代器正确的递增、递减、取值、成员取用是指,递增时指向下一个节点,递减时指向上一个节点,取值时取的是节点的数据值。

template
struct __list_iterator{
	//所有的迭代器都要有这5个typedef
	typedef __list_iterator self;
	typedef bidirectional_iterator_tag iterator_category;//(1)
	typedef T value_type;//(2)
	typedef Ptr pointer;//(3)
	typedef Ref reference;//(4)
	typedef __list_node* link_type;
	typedef ptrdiff_t difference_type;//(5)

	link_type node;//当前类型的指针
	
	//*就是取值
	reference operator*() const { return (*node).data; }
	//->类似指针
	pointer operator->() const { return &(operator*()); }
	self& operator++()//前置++,++i,返回引用,允许++++i
	{ node = (link_type)((*node).next); return *this;}
	//为了区分前置++与后置++,后置++的参数要有一个int
	self operator++(int)//后置++,i++,返回++前的值,不允许i++++
	{ self tmp = *this; ++*this; return tmp;}
	...
}

你可能感兴趣的:(侯捷老师STL,list,链表,散列表)