前言

STL六大组件中的容器按照结构特征可分为顺序容器(链状)、关联式容器(树状)和无序式容器。本文就其中顺序容器进行总结和介绍。


一、顺序容器概述

标准库顺序容器有:vector、deque、list、forward_list、arry、string。六个顺序容器中,只有arry是固定大小。

容器是前端还是后端 容器类型_容器

  1. vector: string和vector将元素保存在连续的内存空间中,因此由下标计算其地址很方便。但因为其连续的特性,在其中间位置添加或删除元素非常耗时,这可能会移动变动位置之后的所有元素。
    注: vector容器的扩展方式是2倍扩展,如果当前容器没有空间容纳新元素,容器会分配新内存空间来保存已有元素和新元素,将已有元素copy到新空间中,添加新元素,然后释放旧空间。
  2. list: list和forward_list两个容器设计目的是让容器任意位置添加和删除操作很快速。但代价就是这两个容器不支持元素随机访问,访问一个元素需要遍历整个容器。
  3. deque: deque是更为复杂的结构,支持快速随机访问。同vector一样,在其中间位置添加或删除元素非常耗时。但在其两端添加和删除元素很快。deque是靠iterator模拟的连续空间,deque分配内存方式可参考下图。
    注: deque容器的扩展方式同vector相似,如果当前容器没有空间容纳新元素,容器会分配新内存空间来保存已有元素和新元素。不同的是,deque将旧元素copy到新位置时,会copy到中段的位置,以方便其双向进出的特性。
  4. 容器是前端还是后端 容器类型_删除元素_02

  5. forward_list: forward_list和arry是C++新标准增加的类型,forward_list设计目的设计目的是达到与手写的单向链表数据结构相当的性能。
  6. arry: arry对象大小是固定的,因此不支持添加和删除元素以及改变容器大小的操作。但同内置类型比,arry更安全更容易使用。
  7. string: string与vector相似,但是用于保存字符的容器,随机访问快。

二、选择使用哪种顺序容器

通常使用vector是最好选择,除非你需要其他容器的功能。
如果你不确定应该用哪种容器,可以在程序中只使用vector和list公共的操作:使用迭代器,不使用下标操作,避免随机访问。

此外还有一些选择容器原则:

  • 除非有很好的理由选择其他容器,否则应选vector。
  • 如果程序中有很多小的元素,且空间额外开销重要,则不要用list和forward_list。
  • 如果要求随机访问元素,使用vector和deque。
  • 如果需要在中间位置插入和删除元素,选list或forward_list。
  • 如果需要在头尾位置插入和删除元素,但不会在中间位置插入或删除,使用deque。
  • 如果只有在输入时才必须在容器中间位置插入元素,可以考虑在输入阶段使用list,输入完成后,将list的内容拷贝到vector中。

总结

在一个顺序容器中,元素是按顺序存放的,通过位置来访问。所有的容器(除来arry)都提供高效的动态内存管理,容器会负责管理其自身的存储,我们不需要担心元素存储在哪里。
容器只定义了极少操作,如构造函数、添加和删除元素的操作、确定容器大小的操作以及返回指向特定元素迭代器的操作。而排序和搜索等,则是由算法实现的。
当添加和删除容器元素操作时,要注意这些操作可能会使指向元素的迭代器、指针、引用失效。