目录

  • 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的迭代器只能进行++/–操作,不支持普通的算数运算。