C++容器vector,list,deque

便于在数据结构题目中偷个懒??(还是好好写ADT⑧)

vector   
vector与数组类似,拥有一段连续的内存空间,并且起始地址不变。便于随机访问,时间复杂度为O(1),但因为内存空间是连续的,所以在进入插入和删除操作时,会造成内存块的拷贝,时间复杂度为O(n)。

此外,当数组内存空间不足,会采取扩容,通过重新申请一块更大的内存空间进行内存拷贝。

List
  list底层是由双向链表实现的,因此内存空间不是连续的。根据链表的实现原理,List查询效率较低,时间复杂度为O(n),但插入和删除效率较高。只需要在插入的地方更改指针的指向即可,不用移动数据。
deque双端队列 double-end queue
deque是在功能上合并了vector和list。
优点:(1) 随机访问方便,即支持[ ]操作符和vector.at()
(2) 在内部方便的进行插入和删除操作
(3) 可在两端进行push、pop
缺点:(1) 占用内存多

vector<T>(向量容器):用来存放 T 类型的元素,是一个长度可变的序列容器,即在存储空间不足时,会自动申请更多的内存。使用此容器,在尾部增加或删除元素的效率最高(时间复杂度为 O(1) 常数阶),在其它位置插入或删除元素效率较差(时间复杂度为 O(n) 线性阶,其中 n 为容器中元素的个数);

deque<T>(双端队列容器):和 vector 非常相似,区别在于使用该容器不仅尾部插入和删除元素高效,在头部插入或删除元素也同样高效,时间复杂度都是 O(1) 常数阶,但是在容器中某一位置处插入或删除元素,时间复杂度为 O(n) 线性阶;

list<T>(链表容器):是一个长度可变的、由 T 类型元素组成的序列,它以双向链表的形式组织元素,在这个序列的任何地方都可以高效地增加或删除元素(时间复杂度都为常数阶 O(1)),但访问容器中任意元素的速度要比前三种容器慢,这是因为 list 必须从第一个元素或最后一个元素开始访问,需要沿着链表移动,直到到达想要的元素。

forward_list<T>(正向链表容器):和 list 容器非常类似,只不过它以单链表的形式组织元素,它内部的元素只能从第一个元素开始访问,是一类比链表容器快、更节省内存的容器。
在这里插入图片描述
容器:
序列式容器(线性结构)

string:

array:C11静态顺序表

vector:动态顺序表

list:带头节点的双向循环链表

deque:动态二维数组

forward_list:带头结点的循环单链表

stack:栈

queue:队列

vector

vector的话这篇blog讲得很好了,所以本辣鸡就不bb了

list

内存空间是不连续的,通过指针来进行数据的访问
相当于双向链表

推荐blog

  • 声明及一些操作
#include<iostream>
#include<list>
using namespace std;
list<int> a;
list<int>::iterator t;//迭代器 
int main()
{
	a.empty();//判断是否为空
	a.push_back(4);//尾插 
	a.push_front(1); //头插 
	//a.resize(5);//resize(n)将list的长度改为只容纳n个元素 
	//a.clear()清空所有元素
	cout<<a.front()<<endl;//获取list容器中的头部元素
	cout<<a.back()<<endl;  
	a.pop_back();
	a.pop_front();//删除 
	
	a.reverse();//逆置 
	a.merge(b);//合并两个链表使之默认升序 降序reverse一下不就行了么...... 
	a.swap(b);//交换
	
	
	for(t=a.begin();t!=a.end();t++)
		cout<<*t<<endl;
}

其它

  • 插入
insert():在指定位置插入一个或多个元素(三个重载):

L1.insert(L1.begin(),100);在L1的开始位置插入100。

L1.insert(L1.begin(),2,200); 在L1的开始位置插入2100。

L1.insert(L1.begin(),L2.begin(),L2.end());在L1的开始位置插入L2的从开始到结束的所有位置的元素。
  • 删除
erase():删除一个元素或一个区域的元素(两个重载)

l1.erase(l1.begin()); 将l1的第一个元素删除。

l1.erase(l1.begin(),l1.end()); 将l1的从begin()end()之间的元素删除。

deque

在这里插入图片描述
其实差不多…所以简略一点

相比于 vector
容器,deque的用法几乎一致但是不同的是deque提供push_front以及pop_front方法,这里的时间效率是O(1),而vector在头部插入时要利用insert,后边的元素要移位,时间为O(n)。

deque支持[]等运算符操作,用法与vector一致

deque<int> d;
d[3] 就是访问第4个元素(0,1,2,3

好的就这样水一下吧
例程

发布了46 篇原创文章 · 获赞 13 · 访问量 3678

猜你喜欢

转载自blog.csdn.net/qq_39679772/article/details/104730456