STL源码剖析——list
来源:互联网 发布:20m网络限速多少合适 编辑:程序博客网 时间:2024/06/14 23:05
list不仅是一个双向链表,而且还是一个环状双向链表。另外,还有一个重要性质,插入操作和接合操作都不会造成原有的list迭代器失效,这在vector是不成立的。因为vector的插入操作可能造成记忆体重新配置,导致原有的迭代器全部失效。甚至list的元素删除操作(erase),也只有“指向被删除元素”的那个迭代器失效,其他迭代器不受任何影响。
list节点数据结构:
template <class T> struct __list_node { typedef void* void_pointer; void_pointer next; void_pointer prev; T data; };
list的transfer函数:
list内部提供一个迁移操作(transfer):将连续范围内的元素迁移到某个特定位置之前。
//将[first, last)内元素移动到position之前void transfer(iterator position, iterator first, iterator last) {if (position != last) {(*(link_type((*last.node).prev))).next = position.node;//(1)(*(link_type((*first.node).pre))).next = last.node;//(2)(*(link_type((*position.node).pre))).next = first.node;//(3)link_type tmp = link_type((*position.node).prev);//(4)(*position.node).prev = (*last.node).prev;//(5)(*last.node).prev = (*first.node).prev;//(6)(*first.node).prev = tmp;//(7)}}
list 的特点:
(1) 不使用连续的内存空间这样可以随意地进行动态操作;
(2) 可以在内部任何位置快速地插入或删除,当然也可以在两端进行push 和pop 。
(3) 不能进行内部的随机访问,即不支持[ ] 操作符和vector.at() ;
(4) 相对于verctor 占用更多的内存。
List常用操作函数:
Lst1.assign() 给list赋值
Lst1.back() 返回最后一个元素
Lst1.begin() 返回指向第一个元素的迭代器
Lst1.clear() 删除所有元素
Lst1.empty() 如果list是空的则返回true
Lst1.end() 返回末尾的迭代器
Lst1.erase() 删除一个元素
Lst1.front() 返回第一个元素
Lst1.get_allocator() 返回list的配置器
Lst1.insert() 插入一个元素到list中
Lst1.max_size() 返回list能容纳的最大元素数量
Lst1.merge() 合并两个list
Lst1.pop_back() 删除最后一个元素
Lst1.pop_front() 删除第一个元素
Lst1.push_back() 在list的末尾添加一个元素
Lst1.push_front() 在list的头部添加一个元素
Lst1.rbegin() 返回指向第一个元素的逆向迭代器
Lst1.remove() 从list删除元素
Lst1.remove_if() 按指定条件删除元素
Lst1.rend() 指向list末尾的逆向迭代器
Lst1.resize() 改变list的大小
Lst1.reverse() 把list的元素倒转
Lst1.size() 返回list中的元素个数
Lst1.sort() 给list排序
Lst1.splice() 合并两个list
Lst1.swap() 交换两个list
Lst1.unique() 删除list中重复的元素
- STL源码剖析—list
- STL源码剖析——list
- STL源码剖析——list
- STL源码剖析---list
- STL源码剖析---list
- STL源码剖析---list
- STL源码剖析---list
- STL源码剖析---list
- STL源码剖析----list
- STL源码剖析---list
- 【STL】list源码剖析
- STL源码剖析——序列容器之list
- STL源码剖析——序列容器之list
- STL之list源码剖析
- STL 之 list 源码剖析
- STL源码剖析之list
- STL源码剖析-list transfer()
- STL之list源码剖析
- springMVC 通过服务器下载功能
- 网易云课堂 python网络爬虫实战
- ubuntu下useradd与adduser区别,新建用户不再home目录下
- 解析UML用例图中include与extend的区别
- UI、交互、产品设计的自学方法
- STL源码剖析——list
- 设计师要走怎样的职业之路
- 连接微信公众平台
- ssm框架下fileupload图片上传实践
- 编译内核出现错误
- python入门系列16―——正则表达式1
- Eclipse全文搜索,很实用
- 电动汽车控制策略
- K-近邻算法