容器学习3——顺序容器概括

顺序容器概括

一个容器就是一些特定对象的集合,顺序容器提供了控制元素存储和访问顺序的能力,这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应。

常用的顺序容器

vector 可变大小数组,支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢
deque 双端队列。支持快速随机访问。在头尾位置插入/删除速度很快
list 双向链表,只支持双向顺序访问。在list中任何位置进行插入/删除操作速度都很快
forward_list 单向链表,只支持单向顺序访问,在链表中任何位置进行插入/删除操作都很快
array 固定大小数组。支持快速随机访问。不能添加或者删除元素
string 与vector类似的容器,但专门用于保存字符。随机访问很快。在尾部插入/删除很快
  1. string和vector将元素保存在连续的内存空间中,由于元素时连续存储的,由下标来计算其他地址时非常快速的。支持随机访问(一般通过下标)。但是在这两种容器中间位置进行添加或者删除操作会很麻烦:在一次插入或者删除操作后,需要移动插入/删除位置之后的所有元素?
  2. list(双链表)和forward_list(单链表)两个容器的设计目的是令容器中任何位置的添加和删除操作都很快速。作为代价,这两个容器不支持随机访问:为了访问一个元素,只能遍历整个容器。而且内存消耗也比较大(因为要存储指针啥的)
  3. deque与string和vector类似,deque支持快速随机访问,同样的在中间位置进行插入和删除操作的代价也很高,但是在deque两端添加或者删除元素都是很快的
  4. forward_list和array是新C++标准增加的类型,与内置数组相比,arrray是一种更安全,更容易使用的数组类型,array对象是大小固定的。因此,array不支持添加和删除元素以及改变容器大小的操作。forward_list的设计目标是达到与手写的单链表数据结构相当的性能。因此,forward_list没有size操作

小总结:

  1. array和内置数组的联系与区别:
  • array是和内置数组一样,是一种固定大小的容器类型,在一开始时就要声明大小和初始化,array的声明为:array<int,10> ial;
  • 内置数组不能直接使用拷贝和赋值,而是需要遍历拷贝,但是array却可以使用拷贝和赋值的方式进行初始化(只要保证类型一致)
  • array所需要的头文件为 #include<array>
  1. forward_list是和数据结构单链表手写的类似,所以很多功能特性也跟单链表一样。
  2. deque和vector都支持随机访问,但是两者的存储方式却有差异:deque是以块来存储,每块包含相同数量大小的元素,而vector是采用一块内存来存储连续的元素,
  3. vector的缺点主要在于向vector添加元素的时候,如果容量不足,vector便会重新malloc一段更大的内存,然后把原内存中的数据memcpy到新的内存中,并free原内存块,然后将新元素加入。如果插入位置在头部或者中间位置,则需要将元素后移,效率并不是很高

容器的选择使用

  • 一般情况下都会使用vector(vector已经能满足绝大数开发)
  • 如果程序中有很多的小元素,且空间的额外开销很重要,那么就不要使用list和forward_list
  • 如果要求随机访问,则使用vector或deque
  • 如果程序要求在容器中间插入或者删除元素,则使用list或者forward_list
  • 如果只在头尾插入/删除元素,则应使用deque
发布了37 篇原创文章 · 获赞 0 · 访问量 579

猜你喜欢

转载自blog.csdn.net/clearLB/article/details/104110162