您的位置:首页 > 其它

STL源码剖析学习五:list

2012-04-21 17:31 465 查看
每次插入或者删除一个元素,就配置或者释放空间。
插入和删除元素操作都是常数时间。

list的节点:

template<class T>
struct __list_node{
typedef void* void_pointer;
void_pointer prev;
void_pointer next;
T data;
}


是一个双向链表

list的迭代器:
不能用普通指针作为迭代器

typedef __list_node<T>* link_type;
link_type node;


list是一个双向链表,提供迭代器为双向迭代器,可向前向后移动,但不提供随机访问能力
插入删除接合操作不会引起list迭代器的失效。

list的数据结构:
环状双向链表,只需要一个指针就可以完整表现整个链表

typedef __list_node<T> list_node;
typedef list_node* link_type;
link_type node;


如果让node指向刻意置于尾端的一个空白节点,就可以符合STL前闭后开的原则。

用于配置、释放、构造、销毁节点的函数

link_type get_node
{
return list_node_allocator::allocate();
}
void put_node(link_type p)
{
list_node_allocator::deallocator(p);
}
link_type create_node(const T& x)
{
link_typr p = get_node();
construct(&p->data,x);
return p;
}
void destroy_node(link_type p)
{
destroy(&p->data);
put_node(p)
}


关键函数insert最简单的形式

iterator insert(iterator position, const T& x)
{
link_type tmp = create_node(x);
tmp->next = position.node;
tmp->prev = position.node->prev;
(link_type(position.node->prev))->next = tmp;
position.node->prev = tmp;
return tmp;
}


push_back是在insert的基础上实现的

list内部提供一个迁移操作transfer:把某个连续范围内的元素迁移到某个位置之前。
是其他复杂操作如splice sort merge等的基础,是非公开接口。

void transfer(iterator position, itrator first, iterator last)
{
if(position != last)
{
(*(link_type((*last.node).prev))).next = position.node;
(*(link_type((*first.node).prev))).next = last.node;
(*(link_type((*position.node).prev))).next = first.node;
link_type tmp = link_type((*position.node).prev);
(*position.node).prev = (*first.node).prev;
(*last.node).prev = (*first.node).prev;
(*first.node).prev = tmp;
}
}


STL不能用标准算法中的sort因为其不能提供随机访问迭代器,只能用自己的sort
任然用快排实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: