标准模板库STL——deque和list

deque概述

deque属于顺序容器,称为双端队列容器

底层数据结构是动态二维数组,从整体上看,deque的内存不连续

初始数组第一维数量为2,必要时进行2倍扩容

每次第一维扩容后,原来数组第二维元素从新数组下标为OldSize/2的第一维开始存储

这样的存储方式使得前后都预留相同空间,方便支持deque首尾元素添加

数组第二维长度固定

deque相关操作

// deque相较于vector增加的相关操作有:push_front()和pop_front()

deque 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 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;

随机访问操作频繁,选择vector

你可能感兴趣的:(C++,c++,STL,deque,list)