1、概述
本篇主要介绍适配器中的第三种,它属于迭代器的适配器,换句话说就是对迭代器进行改造。下面用两个例子reverse_iterator和inserter进行举例。
2、迭代器适配器reverse_iterator
reverse_iterator是用来改造迭代器,使迭代器进行反向操作。如序列式容器中的begin()和end()就是用迭代器适配器reverse_iterator实现。
1)reverse_iterator的结构
解析:
a、reverse_iterator类设计的数据就是迭代器current;
b、该类中与迭代器设计原则类似,也要遵循迭代器的5种设计原则;
c、该适配器与迭代器一样可以实现++、--操作,但是与正常迭代器是反向的,即++实现是--current。
2)适配器的使用
解析:
a、如在vector容器中的成员函数rbegin()和rend()的实现方式就是要使用reverse_iterator迭代器,对begin()和end()进行适配;
b、我们知道begin()和end()的返回容器首部迭代器和尾部迭代器,而rbegin()正好与end()相同,也是返回尾部迭代器,只是rbegin()指向的是尾部的前一个,通过operator*()实现。
c、从reverse_iterator的结构中可以知道,begin()中的++对容器来说是正向的,而rbegin()++是反向的。
2、迭代器适配器insert_iterator
inserter适配器是改造迭代器,使迭代器能使用insert()方法。
1)使用insert_iterator适配器
①使用原来的迭代器
解析:
a、声明一个数组myints和一个vector的容器,里面包含7个空间;
b、使用算法copy()将数组元素拷贝到目标vector容器中,其中copy()算法如下:
解析:
a、copy()是模板函数,第一个参数是原对象的第一个元素的迭代器,第二个参数是原对象的最后一个迭代器,第三个参数是目标拷贝位置的初始迭代器;
b、通过while循环,将原对象一个个拷贝至目标对象中;
②使用inserter_iterator迭代器
解析:
a、声明链表foo,bar,实现将bar中的元素拷贝至foo中第三个元素后,如果使用原来的copy()方法,会将bar中的元素直接一个个放在foo第三个元素后,而本身第三个元素后的元素4,5就会被覆盖;
b、这边使用inserter()函数,inserter()函数其实是使用了insert_itetator。
解析:
a、inserter函数模板中有两个参数,第一个是容器对象,第二个是容器的迭代器。
2)insert_itetator的结构
解析:
a、同迭代器一样,适配器insert_iterator中数据类型包括容器对象和迭代器;
b、当copy()算法调用*result = *first时,会调用拷贝赋值函数operator=,而该函数正是使用了insert()函数来实现对象的插入,这样就不会打破原来foo的结构。