C++Primer笔记(第八,九章)

关键词 : 输入输出流, 顺序容器

第八章: IO库

略.

第九章: 顺序容器

顺序容器: 元素在顺序容器中的顺序与其加入容器时的位置相对应.

关联容器: 元素的位置由元素相关联的关键字值决定.

顺序容器的两个性能指标:

  • 向容器中增删元素的代价
  • 非顺序访问容器中元素的代价
特性
vector 可变大小数组, 支持快速随机访问, 在尾部之外的位置插入或删除元素可能很慢
deque 双端队列, 支持快速随机访问, 在头尾位置插入\删除元素很快
list 双向链表, 只支持双向顺序访问, 在任何位置插入\删除元素都很快
forward_list 单向链表, 只支持单向顺序访问, 在任何位置插入\删除元素都很快
array 固定大小数组, 支持快速随机访问, 不支持插入\删除元素
string 与vector类似, 但专门用于保存字符(这也算是容器吗)

选择容器的基本原则:

  • 优先选用vector
  • 如果程序有很多小的元素, 且空间的额外开销很重要, 则不要使用list或forward_list
  • 如果要求随机访问元素, 应使用vector或deque
  • 如果需要在容器中间插入\删除元素, 应使用list或forward_list
  • 如果只在读取输入时才需要向容器中间插入元素, 随后随机访问 :
    • 可以通过向vector追加元素再sort的方式避免在中间位置添加元素(原文: “确定是否真的需要在容器中间位置添加元素”, 理解: 当元素无序或者不能用某种顺序表达时上面这种方式就失效了)
    • 如果必须在中间位置插入元素, 考虑在输入阶段使用list, 一旦输入完成, 将list中的内容拷贝到一个vector中(空间换时间罢).
  • 一般来说, 应用中占主导地位的操作(访问or增删更多)决定了容器类型的选择