双向链表list
list简介
list是由双向链表实现的, 每个节点存储一个元素, 它可以实现C++数据结构中链表的所有功能.
构造函数
list<int>ls;//创建空list对象
list<int>ls2(size);//创建初始大小为size的list对象
list<int>ls3(size, value);//创建初始大小为size, 每个元素初始值为value的list对象
list<int>ls4(ls3);//拷贝构造
元素修改
list给我们提供了4种修改元素的函数:
ls.push_back(2);//向链表头部插入2
ls.push_front(1);//向链表末尾插入1
ls.pop_front();//删除链表开头的第一个元素
ls.pop_back();//删除链表的末尾元素
list<int>::iterator pos;
ls.insert(pos,1);//插入元素到指定位置
ls.erase(pos);//删除pos位置的元素
ls.erase(pos,pos+2);//删除pos和pos+1位置的元素
ls.clear();//清空链表
其他成员函数
ls.merge(ls2);//将两个链表合成一个链表
ls.sort();//升序排序
ls.sort(greater<int>());//降序排序
ls.remove(1);//删除链表中多有值为1的元素
list和vector的区别
vector | list |
---|---|
可以随机访问, 访问元素效率为O(1) | 不能随机访问, 访问效率为O(n) |
插入, 删除的效率低, 时间复杂度为O(n) | 插入, 删除效率高, 时间复杂度为O(1) |
底层为连续空间不容易造成内存碎片, 空间利用率高, 缓存利用率高 | 底层节点动态开辟, 容易造成内存碎片, 空间利用率低, 缓存利用率低 |
插入, 删除时会导致所有迭代器失效 | 只有删除时才会导致被删除的节点的迭代器失效 |
适用于经常访问, 不经常增删的场合 | 适用于经常需要增删, 访问比较少的场合 |