STL源码剖析学习五:list
2012-04-21 17:31
465 查看
每次插入或者删除一个元素,就配置或者释放空间。
插入和删除元素操作都是常数时间。
list的节点:
是一个双向链表
list的迭代器:
不能用普通指针作为迭代器
list是一个双向链表,提供迭代器为双向迭代器,可向前向后移动,但不提供随机访问能力
插入删除接合操作不会引起list迭代器的失效。
list的数据结构:
环状双向链表,只需要一个指针就可以完整表现整个链表
如果让node指向刻意置于尾端的一个空白节点,就可以符合STL前闭后开的原则。
用于配置、释放、构造、销毁节点的函数
关键函数insert最简单的形式
push_back是在insert的基础上实现的
list内部提供一个迁移操作transfer:把某个连续范围内的元素迁移到某个位置之前。
是其他复杂操作如splice sort merge等的基础,是非公开接口。
STL不能用标准算法中的sort因为其不能提供随机访问迭代器,只能用自己的sort
任然用快排实现。
插入和删除元素操作都是常数时间。
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
任然用快排实现。
相关文章推荐
- STL学习笔记之容器--list(二)源码剖析
- STL源码剖析学习笔记之具备次配置力(sub-allocation)的SGI空间配置器
- STL学习_SGI二级空间配置器源码剖析
- C++ Standard Stl -- SGI STL源码学习笔记(06) stl_vector 与 一些问题的细化 2 push_back函数剖析
- STL之list源码剖析
- STL学习笔记之迭代器--iterator(源码剖析)
- STL源码剖析学习十二:算法之数值算法
- C++ Standard Stl -- SGI STL源码学习笔记(07) stl_vector 与 一些问题的细化 3 resize函数剖析
- STL源码剖析学习原因案例解析(二)
- STL 之 list 源码剖析
- STL源码剖析学习之increment、decrement、dereference实现源码
- STL之list源码剖析
- STL学习_stl_list.h_源码分析
- 【STL】list源码剖析
- STL源码剖析学习十七:算法之其他算法
- (一)stl源码剖析学习,遗留问题在3.7
- STL源码剖析学习二:空间配置器(allocator)
- STL学习笔记之容器--deque(二)源码剖析
- STL 源码剖析读书笔记三:序列式容器之 vector、list
- STL源码剖析学习四:vector