STL迭代器适配器

本文详细介绍了C++ STL中的迭代器适配器,包括反向迭代器、插入迭代器如insert_iterator、front_insert_iterator和back_insert_iterator。文章探讨了这些迭代器的工作原理和使用场景,强调了不同迭代器在遍历和插入元素时的差异,以及迭代器加减操作的适用条件和it++与++it的效率区别。
摘要由CSDN通过智能技术生成

通过学习 C++ STL 标准库中的容器我们知道,无论是序列式容器还是关联式容器(包括哈希容器),要想遍历容器中存储的数据,就只能用使用该容器模板类中提供的迭代器。

STL迭代器适配器种类

反向迭代器(reverse_iterator)
又称“逆向迭代器”,其内部重新定义了递增运算符(++)和递减运算符(–),专门用来实现对容器的逆序遍历。
安插型迭代器(inserter或者insert_iterator)
通常用于在容器的任何位置添加新的元素,需要注意的是,此类迭代器不能被运用到元素个数固定的容器(比如 array)上。
流迭代器(istream_iterator / ostream_iterator)
流缓冲区迭代器(istreambuf_iterator / ostreambuf_iterator)

输入流迭代器用于从文件或者键盘读取数据;相反,输出流迭代器用于将数据输出到文件或者屏幕上。
输入流缓冲区迭代器用于从输入缓冲区中逐个读取数据;输出流缓冲区迭代器用于将数据逐个写入输出流缓冲区。
移动迭代器(move_iterator)
此类型迭代器是 C++ 11 标准中新添加的,可以将某个范围的类对象移动到目标范围,而不需要通过拷贝去移动。

演示了用反向迭代器适配器遍历 list 容器的实现过程:

#include <iostream>
#include <list>
using namespace std;
int main()
{
   
    std::list<int> values{
    1,2,3,4,5 };
    //找到遍历的起点和终点,这里无需纠结定义反向迭代器的语法,后续会详细讲解
    std::reverse_iterator<std::list<int>::iterator> begin = values.rbegin();
    std::reverse_iterator<std::list<int>::iterator> end = values.rend();
    while (begin != end) {
   
        cout << *begin << " ";
        //注意,这里是 ++,因为反向迭代器内部互换了 ++ 和 -- 的含义
        ++begin;
    }
    return 0;
}

反向迭代器适配器(reverse_iterator)

反向迭代器适配器(reverse_iterator),可简称为反向迭代器或逆向迭代器,常用来对容器进行反向遍历,即从容器中存储的最后一个元素开始,一直遍历到第一个元素。

值得一提的是,反向迭代器底层可以选用双向迭代器或者随机访问迭代器作为其基础迭代器。不仅如此,通过对 ++(递增)和 --(递减)运算符进行重载,使得:

  • 当反向迭代器执行 ++ 运算时,底层的基础迭代器实则在执行 – 操作,意味着反向迭代器在反向遍历容器;
  • 当反向迭代器执行 – 运算时,底层的基础迭代器实则在执行 ++ 操作,意味着反向迭代器在正向遍历容器。

实现反向迭代器的模板类定义在 头文件,并位于 std 命名空间中。

#include <iterator>
using namespace std;

在这里插入图片描述
其中,begin 和 end 表示基础迭代器,r(begin) 和 r(end) 分别表示有 begin 和 end 获得的反向迭代器。

#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
int main() {
   
    //创建并初始化一个 vector 容器
    std
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值