【C++初阶】十二、STL---反向迭代器的实现

简介: 目录一、反向迭代器二、反向迭代器的实现

目录

一、反向迭代器

二、反向迭代器的实现


一、反向迭代器

       之前的模拟实现vector、list 的时候,这些都是实现了正向迭代器,反向迭代器都没有实现,这里就要实现反向迭代器

       反向迭代器也是适配器(配接器)的一种,反向迭代器的实现是对正向迭代器的封装,即实现的反向迭代器能支持多种容器,给出该容器的正向迭代器就能支持反向迭代器

     比如 vector 需要反向迭代器,那就把 vector 的正向迭代器传给 反向迭代器,它就可以通过正向迭代器转换出 vector 的反向迭代器。

       也就是说,实现的反向迭代器并包装的这个类,不是针对某个容器而是针对所有容器的,任何一个容器只要你实现了正向迭代器,就可以通过其适配出反向迭代器

要注意反向迭代器的错位访问

对于 list 而言,正向迭代器的 begin 和 end 位置如下

image.png

       begin 位于头结点的下一个节点,end 则位于尾结点的下一个节点,即头节点,正向迭代器 ++ 操作,迭代器是往后走的

image.png

反向迭代器 rbegin 和 rend 位置如下

image.png

       反向迭代器 rbegin() 位于正向迭代器 end() 的位置, 反向迭代器 rend() 位于正向迭代器 begin() 的位置,反向迭代器 ++操作迭代器是往前走的

image.png

vector 反向迭代器也是如此

对于 list 来说,反向迭代器解引用取数据,取的是头节点上一个节点位置的数据,vector 也是如此

二、反向迭代器的实现

Iterator.h

#pragma oncetemplate<classIterator, classRef, classPtr>classReverseIterator{
typedefReverseIterator<Iterator, Ref, Ptr>Self;
public:
ReverseIterator(Iteratorit)
        :_it(it)
    {}
Refoperator*()
    {
Iteratortmp=_it;
return*(--tmp); //取的是上一个的数据    }
Ptroperator->()
    {
return&(operator*());//取的是上一个的数据的地址    }
Self&operator++()
    {
--_it;
return*this;
    }
Self&operator--()
    {
++_it;
return*this;
    }
booloperator!=(constSelf&s)
    {
return_it!=s._it;
    }
private:
Iterator_it;
};

下面套到 list 里面进行测试

//反向迭代器typedefReverseIterator<iterator, T&, T*>reverse_iterator;
typedefReverseIterator<const_iterator, constT&, constT*>const_reverse_iterator;

image.png

在 list 里面添加反向迭代器代码

reverse_iteratorrbegin()
{
returnreverse_iterator(end());
}
reverse_iteratorrend()
{
returnreverse_iterator(begin());
}

测试代码

voidTest_ReverseIterator()
{
fy::list<int>lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
lt.push_back(5);
lt.push_back(6);
fy::list<int>::iteratorit=lt.begin();
while (it!=lt.end())
    {
cout<<*it<<" ";
++it;
    }
cout<<endl;
fy::list<int>::reverse_iteratorrit=lt.rbegin();
while (rit!=lt.rend())
    {
cout<<*rit<<" ";
++rit;
    }
cout<<endl;
}

运行结果

image.png

list 的反向迭代器就完成了,下面测试 vector 的反向迭代器

把 Iterotor.h 拷贝一份到 vector 里面

//反向迭代器typedefReverseIterator<iterator, T&, T*>reverse_iterator;
typedefReverseIterator<const_iterator, constT&, constT*>const_reverse_iterator;

image.png

在 vector 里面添加反向迭代器代码

reverse_iteratorrbegin()
{
returnreverse_iterator(end());
}
reverse_iteratorrend()
{
returnreverse_iterator(begin());
}

测试代码

voidTest_ReverseIterator()
{
fy::vector<int>v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
v.push_back(6);
fy::vector<int>::iteratorit=v.begin();
while (it!=v.end())
    {
cout<<*it<<" ";
++it;
    }
cout<<endl;
//反向迭代器fy::vector<int>::reverse_iteratorrit=v.rbegin();
while (rit!=v.rend())
    {
cout<<*rit<<" ";
++rit;
    }
cout<<endl;
}

运行结果

image.png

----------------我是分割线---------------

文章到这里就结束了,下一篇即将更新

相关文章
|
2月前
|
存储 算法 C++
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
107 10
|
2月前
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
53 2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
|
2月前
|
存储 程序员 C++
C++常用基础知识—STL库(2)
C++常用基础知识—STL库(2)
73 5
|
2月前
|
存储 自然语言处理 程序员
C++常用基础知识—STL库(1)
C++常用基础知识—STL库(1)
60 1
|
2月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化2
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
65 6
|
2月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化1
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
66 7
|
2月前
|
算法 安全 Linux
【C++STL简介】——我与C++的不解之缘(八)
【C++STL简介】——我与C++的不解之缘(八)
|
2月前
|
存储 C++ 容器
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器1
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
55 5
|
2月前
|
存储 编译器 C++
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
【C++篇】揭开 C++ STL list 容器的神秘面纱:从底层设计到高效应用的全景解析(附源码)
59 2
|
2月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
25 0