迭代器是一个对象,可以循环访问 C++ 标准库容器中的元素,并提供对各个元素的访问。 C++ 标准库容器全都提供迭代器,以便算法可以采用标准方式访问其元素,而不必考虑用于存储元素的容器类型。
一、反向迭代器类
基于普通迭代器构建反向迭代器
基本功能:* -> ++ -- != 构造函数
注意事项:迭代器返回值不同需要的模板参数不同
二、List中的应用
节点类
节点是组成链表的基本单位
基本参数:节点类型前后指针、存储的数据
基本功能:构造函数
注意事项1:指针类型为节点类型
注意事项2:数据类型为T,T可能为一个较大的自定义类型,传参时调用其构造函数构造一个匿名对象作为默认的缺省参数,此处认为内置类型也有构造/拷贝构函数,T为内置类型时也可以使用。
List迭代器类
基本功能:* -> 前后置++ 前后置-- != == 构造函数
基本参数:节点类型指针(迭代器本质可看为一个指针)
注意事项1:成员函数基于链表中的节点指针实现
注意事项2:前置是加加/减减再返回改变的迭代器、后置是返回原来的迭代器再加加/减减,局部变量不可引用返回,函数参数不同才可引起重载
注意事项3:此处模板化可解决返回值类型不同(值返回/地址返回、const/非const的问题)
List类
基本参数:节点类对象
基本功能1:正反迭代器(begin,end,rbegin,rend)
注意事项:_head为头节点非第一个存储数据节点,作为带头双向链表的尾节点
基本功能2:构造函数与初始化函数与new
基本功能3:拷贝构造函数、赋值函数与swap函数
注意事项:值传递是把对象的拷贝而不是本身传递给函数,函数中对参数对象的任何修改都不会影响调用该函数的对象本身;
注意事项:重载的赋值函数有引用类型返回值是为了=操作符可以连续使用
基本功能4:析构函数与clear函数、delete
基本功能5:链表头插尾插、头删尾删
基本功能6:insert与erase
注意事项:要返回新节点或删除节点后的迭代器防止迭代器失效,对于链表型数据结构,比如list,使用了不连续分配的内存,删除运算使指向删除位置的迭代器失效,但是不会失效其他迭代器
功能7:输出链表,依据迭代器实现
测试1:改变链表中的数据
测试2:自定义类型链表
测试3:强化for()循环
测试4:insert
测试5:erase
测试6:拷贝构造与赋值
测试7:反向迭代器
三、vector中的应用
基本功能1:反向迭代器(rebegin=end,rend=begin)
基本功能2:构造函数
基本功能3:拷贝构造函数与swap与赋值函数
注意事项:T可能为自定义数据类型,缺省函数传参时以T()形式调用构造函数创建匿名对象作为默认参数
注意事项:对于vector容器要考虑reserve扩容
注意事项:重载的赋值函数有引用类型返回值是为了=操作符可以连续使用
基本功能4:析构函数与delete
基本功能5:size与capacity
注意事项:指针相减得到的是两个指针之间相隔的元素个数
注意事项:size是有效数据个数,capacity是vector当前可用的总容积
注意事项:扩容时用for循环的方式将原区域的数据复制到新空间
注意事项:resize在扩容基础上还会在空白区域初始化填上默认数据
基本功能6:尾插尾删
基本功能7:随机存取
注意事项:vector支持随机存取,此处const修饰this指针实现只读与读写模式
基本功能8:insert与erase
注意事项:vector的insert考虑位置是否合理,考虑是否需要扩容
注意事项:erase要考虑位置是否合理
注意事项:要返回迭代器防止迭代器失效
基本参数:三个iterator对象维护数组的数据开头数据结尾以及空间结尾
测试1:数组数据读取
测试2:insert
测试3:insert
测试4:erase
测试5:vector与string与拷贝构造
测试6:vector与char
测试7:vector实现杨辉三角
测试8:反向迭代器