反向迭代器的实现

简介: 反向迭代器的实现

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



比如:

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

相关文章
|
9月前
|
C++ 容器
【C++】反向迭代器的实现
【C++】反向迭代器的实现
|
2月前
|
设计模式 编译器 C++
【C++】开始了解反向迭代器
这样我们就实现反向迭代器,大家可以在实际中继续体会。
29 3
|
5天前
|
编译器 C++
C++ 反向迭代器的设计与实现
C++ 反向迭代器的设计与实现
|
2月前
|
存储 编译器 C++
【C++/STL】list(常见接口、模拟实现、反向迭代器、)
【C++/STL】list(常见接口、模拟实现、反向迭代器、)
9 0
|
8月前
|
存储 C++ 容器
|
2月前
|
算法 数据处理 C语言
【C++迭代器深度解析】C++迭代器类型之间的继承关系与反向迭代器的独特性
【C++迭代器深度解析】C++迭代器类型之间的继承关系与反向迭代器的独特性
52 0
|
2月前
|
C++ 容器
C++反向迭代器
C++反向迭代器
|
2月前
|
C++
【STL】:反向迭代器
【STL】:反向迭代器
31 0
|
9月前
|
编译器 C++ 容器
【STL】模拟实现反向迭代器
【STL】模拟实现反向迭代器
24 1
|
11月前
【C++STL】list的反向迭代器
【C++STL】list的反向迭代器
42 0