目录
- vector的特点
- list
- deque
- vector、list、deque比较
- capacity vs size
- 存储自定义类对象
- **迭代器 iterator**
vector的特点
内存特点: 内存空间连续,随机访问效率高。
插入删除:插入或者删除某个元素,需要将现有元素进行复制,移动。
如果vector中存储的对象很大,或者构造函数复杂,则在对现有元素进行拷贝时开销较大,因为拷贝对象要调用拷贝构造函数。对于简单的小对象,vector的效率优于list。vector在每次扩张容量的时候,将容量扩展2倍,这样对于小对象来说,效率是很高的。
应用场景:vector适用于对象数量少,简单对象,随机访问元素频繁。支持高效的随机访问和尾端插入、删除操作,其它位置的插入、删除效率低下。
list
- 内存特点
内存空间不连续,依靠指针来连接。具有双链表结构,每个元素维护一个前向和后向指针,因此支持前向、后向遍历。 - 插入删除
支持高效的随机插入、删除操作,但随机访问效率低下,且需要额外维护指针,开销也较大。
应用场景: list适用于对象数量变化大,对象复杂,插入和删除频繁。
deque
- 内存特点
内存空间连续,与vector类似,不同之处在于deque提供了两级数据结构,
第一级完全类似于vector,代表实际容器
另一级维护容器的首位地址。 - 插入删除
支持高效的首端 尾端 插入/ 删除操作。其它位置的插入、删除效率低下。
vector、list、deque比较
- 随机访问操作,选择vector
- 若已知存储元素size,选择vector
- 需要随机 插入 删除,(不仅仅在两端),选择list
- 只有需要在首端进行插入、删除操作的时候,才选择deque,否则选择vector
若既需要随机插入、删除,又需要随机访问,则需要在vector和list之间做折中。
当要存储的是大型的数据类对象时,list要优于vector。
(也可以使用vector来存储指向对象的指针,同样会取得较高的效率,但是指针的维护容易出错,不推荐)
capacity vs size
- capacity是容器需要增长之前,能够盛的元素总数;只有连续存储的容器才有capacity的概念(例如vector,deque,string),list不需要capacity。
- size是容器当前存储的元素的数目。
- vector默认的容量初始值,以及增长规则是依赖于编译器的。
存储自定义类对象
- 用vector存储自定义类对象时,自定义类对象须满足:
有可供调用的无参构造函数
有可用的拷贝赋值函数
迭代器 iterator
- vector与deque的迭代器支持算术运算
- list的迭代器只能进行++/–操作,不支持普通的算数运算。