系列目录:走近STL- STL概论node
好,闲话很少说,直接上干货。
web
一、你好,List
从实现层面看,相较于Vector的线性空间,List的实现要复杂的多。
List的优点在于每次插入或删除一个元素,就分配或释放一个位置。所以,List对于空间的把控有绝对的精准。
并且,对于从任何节点增删数据,List消耗的永远是常数时间。安全
List和Vector的使用应该视元素的多寡、元素的构造复杂度、元素的存取频繁度而定。List优在存取,Vector优在查询。bash
二、List节点
每个本身写过链表的人都知道,链表的节点和链表自己是分开设计的。
那咱们来看一下List的节点设计:svg
template <typename T> struct __list_node { typedef void* void_pointer; void_pointer prev; void_pointer neet; T date; }
显而易见,这是一个通用双向链表的节点(若是对通用链表不了解,建议必定要本身动手设计一个)。
函数
三、List基本函数使用
- 创
#include<list> typedef struct rect { ··· }Rect; list<Rect>test; //声明一个链表,用于存放结构体数据 //若是想以其余方法初始化list列表,能够移步到下一行那个Vector的介绍
- 增
Rect a; ··· test.push_back(a); test.push_front(a); //头尾插入(双向链表) //定点插入 test.insert(test.begin()+10,a); //在第十个节点以前插入a
- 删
//删除test头部的元素 test.erase(test.begin()); //删除test从头至尾的元素 test.erase(test.begin(), test.end()); test.pop_back(); test.pop_front();
其实增删仍是推荐使用迭代器来,由于直接对数据进行操做会存在必定的危险。
在本文第三部分详细讲述了List迭代器操做增删。spa
除了这个函数:test.clear();
这个函数安全得很,反正都清理掉了。.net
- 查、改
//迭代器 list<int>::iterator p; for (p = test.begin(); p != test.end(); p++) cout << *p << " ";
要遍历仍是首推迭代器。全部和遍历有关的仍是用迭代器。设计
- 排
#include<algorithm> test.sort(test.begin(),test.end()); //从头至尾,默认从小到大排序 //通常排序都是要自定义排序的: bool Comp(const int &a,const int &b) { return a>b; } sort(test.begin(),test.end(),Comp); //这样就降序排序。
- 大小
test.size(); //容器已存入数据量 test.capacity(); //容器还能存多少数据量 //其实不用担忧容器不够大,容量要满的时候它会本身扩容
- 其余
(1)压缩list
//去除重复的元素至只保留一个副本 test.unique(); //已通过大小排序的list才能使用
(2)合并list
test.splice(test.end(),test2);//将test2剪切到test后面
最后仍是要提一下头文件:
分不清楚就都写上指针
#include<algorithm> #include<list>
四、迭代器
List的迭代器和Vector仍是有必定区别的,因此我特意分一块出来。
List的迭代器不能随便用普通指针来替代,由于其节点不会在内存中持续存在。
List的迭代器在有一个很好的特性,就是它不会由于节点的增长或合并(splice)操做而失效,即便是删除,也只会使得当前指向被删节点的那个迭代器失效,而不会因记忆体的重置使得所有的迭代器失效。
本文分享 CSDN - 看,将来。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。