STL源码剖析学习五:list
每次插入或者删除一个元素,就配置或者释放空间。
插入和删除元素操作都是常数时间。
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
任然用快排实现。
浙公网安备 33010602011771号