六一的部落格


关关难过关关过,前路漫漫亦灿灿。



  1. 特定类型对象的集合, 以某种方式组织元素

  2. 模板类

    使用时需要提供类型信息来生成特定的容器类型

    string类是模板类实例


类型成员

  1. 类型别名

    用于泛型编程

    -
    value_type 元素类型
    reference 元素的左值引用类型 value_type &
    const_reference 元素的左值引用类型, 具有底层const
  2. 其他

    -
    size_type 无符号整数类型; size操作的返回类型
    difference_type 有符号整数类型; 用于迭代器的加减运算, 表示迭代器之间的距离,迭代器指向同一个容器才有意义; 距离有正负
  3. 迭代器类型

    -
    iterator 迭代器类型
    const_iterator 迭代器所指对象具有顶层const
    reverse_iterator 反向迭代器
    const_reverse_iterator 反向迭代器所指对象具有顶层const

    反向迭代器: 按逆序寻址元素的迭代器

    forward_list不支持反向迭代器

1list<string>::iterator iter;
2
3vector<int>::difference_type count;

容器的元素类型

  1. 可以将容器类型作为元素类型

    1// 可以使用
    2vector<vector<string>> lines;
    3
    4// 老式编译器
    5vector<vector<string> > lines;
  2. 如果元素类型是类类型,该类类型无默认构造函数,定义容器时要提供元素初始化器

    noDefault类型没有默认构造函数,init是其初始化器

    1vector<noDefault> v2(10);                // 错误
    2
    3vector<noDefault> v1(10, init);          // 正确
    

赋值运算符

将左边容器中的全部元素替换为右边容器中元素的拷贝

要求容器类型一致,元素类型一致

  1. 等号右边为容器

    array要求元素个数一致

    1c1 = c2;
    1array<int, 10> digits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    2
    3array<int, 10> copy = digits;            // 正确
    
  2. 等号右边为花括号列表

    赋值时, 花括号列表中元素的个数可能与array的大小不一致, 因此和assign操作一样, array不予支持

    1c1 = {a, b, c...};        
    

测试时, mac编译器支持使用列表对array赋值

仅作了解

1array<int, 10> digits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
2
3digits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
4
5digits = {1, 2, 3, 4, 5, 6, 7, 8, 9};            // digits[0] = 1, digits[9] = 0. array的元素个数不变, 花括号未覆盖元素被赋值0

容器操作


获取容器大小

forward_list不支持

1c.size();

判断容器是否为空

1c.empty();       // !c.size()

容器容量上限

比如一个杯子的规格可以多大, 有白酒杯, 也不是不能有泳池那么大的杯子

STL允许的容器容量上限

1c.max_size();

容器


  1. 特定类型对象的集合, 以某种方式组织元素

  2. 模板类

    使用时需要提供类型信息来生成特定的容器类型

    string类是模板类实例


类型成员

  1. 类型别名

    用于泛型编程

    -
    value_type 元素类型
    reference 元素的左值引用类型 value_type &
    const_reference 元素的左值引用类型, 具有底层const
  2. 其他

    -
    size_type 无符号整数类型; size操作的返回类型
    difference_type 有符号整数类型; 用于迭代器的加减运算, 表示迭代器之间的距离,迭代器指向同一个容器才有意义; 距离有正负
  3. 迭代器类型

    -
    iterator 迭代器类型
    const_iterator 迭代器所指对象具有顶层const
    reverse_iterator 反向迭代器
    const_reverse_iterator 反向迭代器所指对象具有顶层const

    反向迭代器: 按逆序寻址元素的迭代器

    forward_list不支持反向迭代器

1list<string>::iterator iter;
2
3vector<int>::difference_type count;

容器的元素类型

  1. 可以将容器类型作为元素类型

    1// 可以使用
    2vector<vector<string>> lines;
    3
    4// 老式编译器
    5vector<vector<string> > lines;
  2. 如果元素类型是类类型,该类类型无默认构造函数,定义容器时要提供元素初始化器

    noDefault类型没有默认构造函数,init是其初始化器

    1vector<noDefault> v2(10);                // 错误
    2
    3vector<noDefault> v1(10, init);          // 正确
    

赋值运算符

将左边容器中的全部元素替换为右边容器中元素的拷贝

要求容器类型一致,元素类型一致

  1. 等号右边为容器

    array要求元素个数一致

    1c1 = c2;
    1array<int, 10> digits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    2
    3array<int, 10> copy = digits;            // 正确
    
  2. 等号右边为花括号列表

    赋值时, 花括号列表中元素的个数可能与array的大小不一致, 因此和assign操作一样, array不予支持

    1c1 = {a, b, c...};        
    

测试时, mac编译器支持使用列表对array赋值

仅作了解

1array<int, 10> digits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
2
3digits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
4
5digits = {1, 2, 3, 4, 5, 6, 7, 8, 9};            // digits[0] = 1, digits[9] = 0. array的元素个数不变, 花括号未覆盖元素被赋值0

容器操作


获取容器大小

forward_list不支持

1c.size();

判断容器是否为空

1c.empty();       // !c.size()

容器容量上限

比如一个杯子的规格可以多大, 有白酒杯, 也不是不能有泳池那么大的杯子

STL允许的容器容量上限

1c.max_size();