第九章 顺序容器

9.1 顺序容器概述

容器entrypoint 容器小说_容器entrypoint


一般情况下推荐使用vector

9.2 容器库概略

所有容器库通用的操作

容器entrypoint 容器小说_c++_02

1、const类型的迭代器

当不需要进行写访问时,最好使用cbegin和cend

2、容器的定义和初始化

容器entrypoint 容器小说_容器entrypoint_03

3、容器间的拷贝问题

将一个新容器创建为另一个容器的拷贝的方法有两种:可以直接拷贝整个容器;或者拷贝一个由迭代器指定的元素范围。

直接拷贝容器需要类型相同才能够拷贝。

而通过迭代器拷贝只需要类型兼容就可以。

容器entrypoint 容器小说_容器entrypoint_04

4、array具有固定大小

array的大小也是类型的一部分

容器entrypoint 容器小说_迭代器_05


在对array进行初始化时:

①、初始化值的个数问题

②、array可以直接拷贝另一个array。而内置数组类型则不行

容器entrypoint 容器小说_容器entrypoint_06

5、赋值与swap

容器entrypoint 容器小说_迭代器_07


赋值会导致迭代器、引用、指针失效

通常使用非成员版本的swap效果更好

6、关系运算符

容器entrypoint 容器小说_c++_08


只有当其元素类型也定义了相应的比较运算符时,我们才可以使用关系运算符来比较两个容器。

如果元素类型不支持所需运算符,那么保存这种元素的容器九不能使用相应的关系运算符。

9.3 顺序容器操作

1、添加元素

容器entrypoint 容器小说_容器entrypoint_09


注意插入元素会使指向容器的迭代器、引用和指针失效!!!

①、push_back和emplace的关系
push_back是直接将对象的拷贝插入容器
emplace是将对象构造函数的参数传递进容器,然后容器在使用构造函数构造相应的对象。

②、insert函数
insert的第一个参数为迭代器。在该迭代器之前添加新元素。
返回值为新添加的第一个元素的迭代器。可以使用该返回值循环的插入新元素。

③、可以使用insert函数实现push_front函数的功能

容器entrypoint 容器小说_c++_10


使用insert函数,传入begin迭代器

2、访问元素

容器entrypoint 容器小说_容器entrypoint_11


①、访问元素返回的是引用,对该引用的修改直接影响到容器里面对应值的改变②、c.back返回的是最后一个元素,而c.end返回的是最后一个元素的后一个位置的迭代器

容器entrypoint 容器小说_字符串_12


③、推荐使用at函数访问

如果使用at成员函数进行访问,当下标非法时,会有报错提醒。

而使用一般的下标运算符访问时,非法时不会报错

容器entrypoint 容器小说_c++_13

3、删除元素

容器entrypoint 容器小说_迭代器_14


注意迭代器失效问题!!

erase函数的返回值:
指向最后一个被删除元素之后元素的迭代器。可以利用它进行循环删除

4、特殊的forward_list操作

容器entrypoint 容器小说_字符串_15

5、改变容器的大小

可以用resize来增大或缩小容器

容器entrypoint 容器小说_迭代器_16


容器entrypoint 容器小说_c++_17

6、容器操作可能会使迭代器、引用、指针失效

容器entrypoint 容器小说_c++_18


容器entrypoint 容器小说_c++_19


使用失效的迭代器、指针或者引用是严重的运行时错误!

使用迭代器(或指向容器元素的指针或引用)时,最小化要求迭代器必须保持有效的程序片段是一个好的方法。①、不要保存end返回的迭代器

容器entrypoint 容器小说_迭代器_20


需要在每次插入操作后重新调用end()

9.4 vector对象是如何增长的

vector对象在每次存储的元素超出限制时,会申请一块比新加入元素更大的内存空间,以备后续添加新元素。

容器entrypoint 容器小说_顺序容器_21


size指的是当前有多少个元素

capacity指的是容器的容量,最大可以容纳多少个元素。

9.5 额外的string操作

string本身也是一个顺序容器,之前介绍的公共方法也适合它。而这里介绍只适用于string的方法

1、构造string的其它方法

容器entrypoint 容器小说_c++_22


当用字符数组构造字符串时,必须以空字符结尾

容器entrypoint 容器小说_容器entrypoint_23

2、substr

容器entrypoint 容器小说_c++_24

3、改变string的其它方法

容器entrypoint 容器小说_字符串_25


①、replace是erase和insert的组合方法

容器entrypoint 容器小说_c++_26


先调用erase把原来的删除了,在调用insert将新元素添加到指定位置

3、string的搜索操作

容器entrypoint 容器小说_顺序容器_27


①、find_first_of系列函数函数十分有用

容器entrypoint 容器小说_顺序容器_28


相当于给一个字母表,返回字符串中出现字母表元素的第一个位置

4、数值转换

容器entrypoint 容器小说_容器entrypoint_29


字符串和数字表示的二进制模式不同,需要通过特定函数才能实现转换。

容器entrypoint 容器小说_迭代器_30


需要引入头文件string

函数在std命名空间之下

9.6 容器适配器

容器entrypoint 容器小说_顺序容器_31


容器entrypoint 容器小说_顺序容器_32