deque概述
deque属于顺序容器,称为双端队列容器
底层数据结构是动态二维数组,从整体上看,deque的内存不连续
初始数组第一维数量为2,必要时进行2倍扩容
每次第一维扩容后,原来数组第二维元素从新数组下标为OldSize/2的第一维开始存储
这样的存储方式使得前后都预留相同空间,方便支持deque首尾元素添加
数组第二维长度固定
deque相关操作
// deque相较于vector增加的相关操作有:push_front()和pop_front()
deque<int> deq;
// 1、添加
deq.push_back(10);
// (1)向末尾添加元素10,时间复杂度为O(1)
deq.push_front(20);
// (2)向首部添加元素20,时间复杂度为O(1)
deq.insert(it, 30);
// (3)向迭代器it处添加元素30,需要挪动元素和更新迭代器,时间复杂度为O(n)
// 2、删除
deq.pop_back();
// (1)删除末尾元素,时间复杂度为O(1)
deq.pop_front();
// (2)删除首部元素,时间复杂度为O(1)
deq.erase(it);
// (3)删除迭代器it处元素,需要挪动元素和更新迭代器,时间复杂度为O(n)
// 3、查询
// (1)使用迭代器遍历
辨析vector和deque
1、底层数据结构不同
vector底层是动态一维数组;
deque底层是动态二维数组
2、添加删除元素的时间复杂度不同
首部添加删除操作频繁,选择deque
3、内存使用效率不同
vector需要连续内存空间,内存使用效率低;
deque分块存储数据,不要求内存空间连续,内存使用效率高
4、在中间位置添加删除的效率不同
vector效率更高,deque效率更低
因为vector使用连续内存空间,方便挪动元素
而deque的内存空间不连续,不便挪动元素
list概述
list属于顺序容器,称为链表容器
底层数据结构是双向循环链表
list相关操作
// list相较于vector增加的相关操作有:push_front()和pop_front()
list<int> mylist;
// 1、添加
mylist.push_back(10);
// (1)向末尾添加元素10,时间复杂度为O(1)
mylist.push_front(20);
// (2)向首部添加元素20,时间复杂度为O(1)
mylist.insert(it, 30);
// (3)向迭代器it处添加元素30,需要更新迭代器,时间复杂度为O(1)
// 链表进行insert前,需要进行query查询
// 对于链表来说,query查询效率低
// 2、删除
mylist.pop_back();
// (1)删除末尾元素,时间复杂度为O(1)
mylist.pop_front();
// (2)删除首部元素,时间复杂度为O(1)
mylist.erase(it);
// (3)删除迭代器it处元素,需要更新迭代器,时间复杂度为O(1)
// 3、查询
// (1)使用迭代器遍历
辨析vector和list
1、底层数据结构不同
vector底层是动态一维数组;
list底层是双向循环链表
2、时间复杂度不同
vector:增加删除O(n)、查询O(n)、随机访问O(1)
list:增加删除O(1)、查询O(n)
增加删除操作频繁,选择list;文章来源:https://www.toymoban.com/news/detail-656740.html
随机访问操作频繁,选择vector文章来源地址https://www.toymoban.com/news/detail-656740.html
到了这里,关于标准模板库STL——deque和list的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!