vetor在任意位置进行插入和删除需要搬移大量数据
list是一个双向带头结点的双向链表
带头结点的原因:
-
头插/头删 操作方便
-
end指针存放在头节点
-
双向可循环
list的常用接口
1、list类的创建
list() | 默认构造 |
|
list(10) |
默认第二个参数是0 |
|
list(10,'a') |
赋值构造 |
|
list(v.begin(), v.end()) |
迭代器(区间)构造 |
|
list(arr,arr+19) |
给定指针也可以 |
|
2 list的容量操作
resize()
3、list的遍历操作
list<int>::iterator it = L2.begin();dd
while{
cout << *it << endl;
++it;// 前置++比后置++效率高
}
// 使用的范围for打印
auto it = L2.begin();
for(auto it:L2 ) cout <<*it << endl;
4、list的修改
unique()去重【相邻相同的元素】 |
可以让连在一起的相同元素进行去重(将他的乱序的可以先排序) |
sort()compare_nocase排序 |
顺序和逆序 |
remove(const&T)->是引用 |
移除指定值的节点 |
erase(iterator position)->是迭代器 |
移除指定迭代器的节点 |
splice()拼接 |
|
merge()合并 |
|
find()在vector和list中没有find方法
vector和list都是线性结构,查找的时候都是将vector和list都遍历一遍,所以在标准库中实现一个find就可以了
map中有专门的find方法
vector和list 的区别
|
vector |
list |
底层结构不同 |
动态顺序表 |
带头结点的双向链表 |
访问的方式不同 |
支持随机访问 |
不支持 |
容量操作不同 |
在插入元素时,可能需要扩容 |
没有容量操作 |
空间利用率不同 |
平均比较低 |
平均比较高 |
对内存的影响不同 |
可连续的利用空间 |
碎片化空间 |
插入的元素效率不同 |
差O(n) |
优O(1) |
迭代器的不同 |
迭代器 |
|
处理速度不同 |
处理速度高 缓存利用率不同(由于数据的局部原理性,内存加载缓存是批量加载) |
处理速度低 |