反向迭代器的实现

简介: 反向迭代器的实现

       对于带有迭代器的容器,有正向迭代器,也有反向迭代器,而正向迭代器和反向迭代器比较相似,所以我们可以写一个反向迭代器的模板,给编译器,从传不同的容器的正向迭代器,实例化出对应的反向迭代器,也就是对正向迭代器进行封装,实现反向迭代器,



比如:

template<class Iterator,class Ref,class Ptr>
struct ReverseIterator
{
  typedef ReverseIterator<Iterator, Ref, Ptr> Self;
  Iterator _it;
  ReverseIterator(Iterator it)
    :_it(it)
  { }
  Ref operator*()
  {
    Iterator tmp = _it;
    return *(--tmp);//返回当前节点的上一个节点的值
  }
  Ptr operator->()
  {
    return &(operator*());
  }
 
  Self& operator++()
  {
    --_it;
    return *this;
  }
  Self& operator--()
  {
    ++_it;
    return *this;
  }
  bool operator!=(const Self& s)
  {
    return _it != s._it;
  }
 
};


//反向迭代器
typedef ReverseIterator<iterator, T&, T*> reverse_iterator;
typedef ReverseIterator<const_iterator, const T&, const T*> const_reverse_iterator;
 
reverse_iterator rbegin()
{
  return reverse_iterator(end());
}
reverse_iterator rend()
{
  return reverse_iterator(begin());
}

这是以list为例,实现的反向迭代器;



rbegin在end处,也就是哨兵位的地方,rend在begin处,这样写是为了和正向迭代器对称;


Ref operator*()
    {
        Iterator tmp = _it;
        return *(--tmp);//返回当前节点的上一个节点的值
    }


当我i们返回节点时,先 -- 解引用,这样得到的是前一个节点的值,这样就可以解决哨兵位没有有效值的问题了;这个过程是对正向迭代器进行封装实现反向迭代器!

相关文章
【C++】反向迭代器的实现
【C++】反向迭代器的实现
|
28天前
|
算法 编译器 C++
【C++】模板详细讲解(含反向迭代器)
C++模板是泛型编程的核心,允许编写与类型无关的代码,提高代码复用性和灵活性。模板分为函数模板和类模板,支持隐式和显式实例化,以及特化(全特化和偏特化)。C++标准库广泛使用模板,如容器、迭代器、算法和函数对象等,以支持高效、灵活的编程。反向迭代器通过对正向迭代器的封装,实现了逆序遍历的功能。
34 3
|
7月前
|
设计模式 编译器 C++
【C++】开始了解反向迭代器
这样我们就实现反向迭代器,大家可以在实际中继续体会。
50 3
|
2月前
反向输出一个链表
【10月更文挑战第2天】反向输出一个链表。
14 2
|
6月前
|
编译器 C++
C++ 反向迭代器的设计与实现
C++ 反向迭代器的设计与实现
|
6月前
|
C++ 容器
【c++】优先级队列|反向迭代器(vector|list)
【c++】优先级队列|反向迭代器(vector|list)
47 0
|
7月前
|
存储 编译器 C++
【C++/STL】list(常见接口、模拟实现、反向迭代器、)
【C++/STL】list(常见接口、模拟实现、反向迭代器、)
53 0
|
7月前
|
算法 数据处理 C语言
【C++迭代器深度解析】C++迭代器类型之间的继承关系与反向迭代器的独特性
【C++迭代器深度解析】C++迭代器类型之间的继承关系与反向迭代器的独特性
106 0
|
7月前
|
C++ 容器
C++反向迭代器
C++反向迭代器