容器
2023年12月23日 2023年12月26日
-
特定类型对象的集合, 以某种方式组织元素
-
模板类
使用时需要提供类型信息来生成特定的容器类型
string类是模板类实例
类型成员
-
类型别名
用于泛型编程- value_type 元素类型 reference 元素的左值引用类型 value_type &
const_reference 元素的左值引用类型, 具有底层const -
其他
- size_type 无符号整数类型; size操作的返回类型 difference_type 有符号整数类型; 用于迭代器的加减运算, 表示迭代器之间的距离,迭代器指向同一个容器才有意义; 距离有正负 -
迭代器类型
- iterator 迭代器类型 const_iterator 迭代器所指对象具有顶层const reverse_iterator 反向迭代器 const_reverse_iterator 反向迭代器所指对象具有顶层const 反向迭代器: 按逆序寻址元素的迭代器
forward_list不支持反向迭代器
1list<string>::iterator iter; 2 3vector<int>::difference_type count;
容器的元素类型
-
可以将容器类型作为元素类型
1// 可以使用 2vector<vector<string>> lines; 3 4// 老式编译器 5vector<vector<string> > lines;
-
如果元素类型是类类型,该类类型无默认构造函数,定义容器时要提供元素初始化器
noDefault类型没有默认构造函数,init是其初始化器
1vector<noDefault> v2(10); // 错误 2 3vector<noDefault> v1(10, init); // 正确
赋值运算符
将左边容器中的全部元素替换为右边容器中元素的拷贝
要求容器类型一致,元素类型一致
-
等号右边为容器
array要求元素个数一致1c1 = c2;
1array<int, 10> digits = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 2 3array<int, 10> copy = digits; // 正确
-
等号右边为花括号列表
赋值时, 花括号列表中元素的个数可能与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();