第九章 顺序容器
9.1 顺序容器概述
一般情况下推荐使用vector
9.2 容器库概略
所有容器库通用的操作
1、const类型的迭代器
当不需要进行写访问时,最好使用cbegin和cend
2、容器的定义和初始化
3、容器间的拷贝问题
将一个新容器创建为另一个容器的拷贝的方法有两种:可以直接拷贝整个容器;或者拷贝一个由迭代器指定的元素范围。
直接拷贝容器需要类型相同才能够拷贝。
而通过迭代器拷贝只需要类型兼容就可以。
4、array具有固定大小
array的大小也是类型的一部分
在对array进行初始化时:
①、初始化值的个数问题
②、array可以直接拷贝另一个array。而内置数组类型则不行
5、赋值与swap
赋值会导致迭代器、引用、指针失效
通常使用非成员版本的swap效果更好
6、关系运算符
只有当其元素类型也定义了相应的比较运算符时,我们才可以使用关系运算符来比较两个容器。
如果元素类型不支持所需运算符,那么保存这种元素的容器九不能使用相应的关系运算符。
9.3 顺序容器操作
1、添加元素
注意插入元素会使指向容器的迭代器、引用和指针失效!!!
①、push_back和emplace的关系
push_back是直接将对象的拷贝插入容器
emplace是将对象构造函数的参数传递进容器,然后容器在使用构造函数构造相应的对象。
②、insert函数
insert的第一个参数为迭代器。在该迭代器之前添加新元素。
返回值为新添加的第一个元素的迭代器。可以使用该返回值循环的插入新元素。
③、可以使用insert函数实现push_front函数的功能
使用insert函数,传入begin迭代器
2、访问元素
①、访问元素返回的是引用,对该引用的修改直接影响到容器里面对应值的改变②、c.back返回的是最后一个元素,而c.end返回的是最后一个元素的后一个位置的迭代器。
③、推荐使用at函数访问
如果使用at成员函数进行访问,当下标非法时,会有报错提醒。
而使用一般的下标运算符访问时,非法时不会报错
3、删除元素
注意迭代器失效问题!!
erase函数的返回值:
指向最后一个被删除元素之后元素的迭代器。可以利用它进行循环删除
4、特殊的forward_list操作
5、改变容器的大小
可以用resize来增大或缩小容器
6、容器操作可能会使迭代器、引用、指针失效
使用失效的迭代器、指针或者引用是严重的运行时错误!
使用迭代器(或指向容器元素的指针或引用)时,最小化要求迭代器必须保持有效的程序片段是一个好的方法。①、不要保存end返回的迭代器
需要在每次插入操作后重新调用end()
9.4 vector对象是如何增长的
vector对象在每次存储的元素超出限制时,会申请一块比新加入元素更大的内存空间,以备后续添加新元素。
size指的是当前有多少个元素
capacity指的是容器的容量,最大可以容纳多少个元素。
9.5 额外的string操作
string本身也是一个顺序容器,之前介绍的公共方法也适合它。而这里介绍只适用于string的方法
1、构造string的其它方法
当用字符数组构造字符串时,必须以空字符结尾
2、substr
3、改变string的其它方法
①、replace是erase和insert的组合方法
先调用erase把原来的删除了,在调用insert将新元素添加到指定位置
3、string的搜索操作
①、find_first_of系列函数函数十分有用
相当于给一个字母表,返回字符串中出现字母表元素的第一个位置
4、数值转换
字符串和数字表示的二进制模式不同,需要通过特定函数才能实现转换。
需要引入头文件string
函数在std命名空间之下
9.6 容器适配器