1. 容器就是某种特定类型的集合。容器之间会提供一些公用的接口,此外没有哪种容器是最优的,只有适合的:

Cxx primer-chap9-Sequential Containers_顺序容器

  1. sequential 容器类型:

Cxx primer-chap9-Sequential Containers_c++_02

  1. 各个容器的优缺点概览:

Cxx primer-chap9-Sequential Containers_c++_03

Cxx primer-chap9-Sequential Containers_构造器_04

  1. ,其中arrayforward_list是新标准添加的。
  2. 库实现的容器较快,鼓励使用:

Cxx primer-chap9-Sequential Containers_迭代器_05

  1. 一些经验之谈,其中vector擅长随机访问,list删除随机增删,如果你不确定后续会进行哪些操作,尽量使用vectorlist共通的接口:

Cxx primer-chap9-Sequential Containers_构造器_06

Cxx primer-chap9-Sequential Containers_顺序容器_07

  1. 尽管容器的元素类型可以是任何类型,但是有些操作会对元素类型有要求。例如某个没有默认构造器的类无法使用只提供元素数量的容器构造器:

Cxx primer-chap9-Sequential Containers_c++_08

  1. 迭代器是容器访问元素的通用方式:

Cxx primer-chap9-Sequential Containers_构造器_09

  1. 为什么迭代器类型是left-inclusive ranges

Cxx primer-chap9-Sequential Containers_顺序容器_10

  1. 容器中定义的类型成员:

Cxx primer-chap9-Sequential Containers_顺序容器_11

  1. 惊讶的是,有两个版本的begin

Cxx primer-chap9-Sequential Containers_构造器_12

  1. 使用默认构造器是,除了array,容器为空,不要以为它初始时会自动预留空间:

Cxx primer-chap9-Sequential Containers_构造器_13

  1. 用其他容器来初始化新容器的两种方式:

Cxx primer-chap9-Sequential Containers_迭代器_14

  1. 简单认为,array就是内置数组的安全版本:,

Cxx primer-chap9-Sequential Containers_c++_15

  1. 因为它们的初始化方式都十分相似:

Cxx primer-chap9-Sequential Containers_构造器_16

  1. 容器的关系操作符是建立在元素类型的关系运算符基础上,如果该元素类型不支持关系比较,则容器也不支持:

Cxx primer-chap9-Sequential Containers_构造器_17

Cxx primer-chap9-Sequential Containers_c++_18

  1. ,具体而言就是元素类型的==<:,注意unordered associative containers不支持比较运算,相等判断可以。
  2. 顺序容器涉及的添加元素操作:

Cxx primer-chap9-Sequential Containers_迭代器_19

Cxx primer-chap9-Sequential Containers_顺序容器_20

  1. push_backpush_front只是在容器的两端进行插入,而insert是更泛化的形式:

Cxx primer-chap9-Sequential Containers_c++_21

  1. push操作会发生拷贝,而emplace_front()emplace()emplace_back()直接在目标内存位置调用元素类型的构造函数:

Cxx primer-chap9-Sequential Containers_迭代器_22

  1. 对于顺序容器的删除操作,我们需要保证该元素存在:

Cxx primer-chap9-Sequential Containers_顺序容器_23

  1. 改变容器中元素的数量:

Cxx primer-chap9-Sequential Containers_迭代器_24

  1. 对于容器的增删操作会使迭代器、引用和指针失效:

Cxx primer-chap9-Sequential Containers_c++_25

  1. ,建议的操作是要及时更新相应的迭代器:,例如因为end()经常失效,所以应该避免存储end()

Cxx primer-chap9-Sequential Containers_顺序容器_26

  1. 对于vector而言,它的内存是如何增加的:

Cxx primer-chap9-Sequential Containers_迭代器_27

Cxx primer-chap9-Sequential Containers_迭代器_28

Cxx primer-chap9-Sequential Containers_c++_29

  1. string library而言,提供一些操作无非就是兼容C风格的字符数组,个人感觉有意思的是子串搜索和匹配操作:

Cxx primer-chap9-Sequential Containers_顺序容器_30

  1. 顺序容器包装的容器适配器:,其中默认情况下:

Cxx primer-chap9-Sequential Containers_顺序容器_31