28 迭代器适配器

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的结构。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值