C++进阶——反向迭代器Reverse_iterator
Reverse_iterator反向迭代器介绍
之前我们学过适配器,但是只实现了普通的迭代器,可是反向迭代器没有实现,当时说之后会实现的,没错就是今日,我们要收复Reverse_iterator-----stl-list。
我们其实可以封装一个反向迭代器库(Reverse_iterator.h),这样不管是什么容器(适配器)都可以使用了,减少了代码的冗余。
反向迭代器的实现
底层实现
用正向迭代器就可以封装出来一个反向迭代器,这也是体现了复用
template<class Iterator, class Ref, class Ptr>
struct Reverse_iterator
{
typedef Reverse_iterator<Iterator, Ref, Ptr> self;
Iterator _it;
Reverse_iterator(Iterator it)
:_it(it)
{}
}
解引用的实现
这其实是利用了之前学过的list的思想,用一个Ref实现引用(可以是const对象,也可以是普通的对象),Ptr也一样可以是 const指针,也可以是普通指针。
//template<class Iterator, class Ref, class Ptr>
Ref operator*()
{
Iterator tmp = _it;
return *--tmp;
}
Ptr operator->()//重中之重
{
return &(operator*());
}
而且这里的 - > 还可以复用operator*()。
迭代器的自加自减
反向迭代器的 + 就是正向迭代器的 - 所以只要函数重载就可以了
//前置
self& operator++()
{
--_it;
return *this;
}
self& operator--()
{
++_it;
return *this;
}
//后置
self operator++(int)
{
self tmp = *this;
--_it;
return tmp;
}
self operator--(int)
{
self tmp = *this;
++_it;
return tmp;
}
判断符号重载
迭代器不需要比较大小,只需要比较等于和不等于
比较的还是迭代器(地址)
bool operator!=(const self& s)
{
return _it != s._it;
}
bool operator==(const self& s)
{
return _it == s._it;
}
完整代码实现
#pragma once
namespace tom
{
// 适配器 -- 复用
template<class Iterator, class Ref, class Ptr>
struct Reverse_iterator
{
typedef Reverse_iterator<Iterator, Ref, Ptr> self;
Iterator _it;
Reverse_iterator(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;
}
//后置
self operator++(int)
{
self tmp = *this;
--_it;
return tmp;
}
self operator--(int)
{
self tmp = *this;
++_it;
return tmp;
}
bool operator!=(const self& s)
{
return _it != s._it;
}
bool operator==(const self& s)
{
return _it == s._it;
}
}
各个容器的实现
vector迭代器
vector迭代器的实现
// 正向迭代器
typedef T* iterator;
typedef const T* const_iterator;
// 正向迭代器
iterator begin()
{
return _start;
}
iterator end()
{
return _finish;
}
const_iterator begin() const
{
return _start;
}
const_iterator end() const
{
return _finish;
}
vector反向迭代器的实现
反向迭代器为了对称把正向迭代器的end当成了反向迭代器的rbegin;把正向迭代器的begin当成了反向迭代器的rend。
// 反向迭代器
typedef Reverse_iterator<iterator, T&, T*> reverse_iterator;
typedef Reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;
// 反向迭代器
const_reverse_iterator rbegin() const
{
return const_reverse_iterator(end());
}
const_reverse_iterator rend() const
{
return const_reverse_iterator(begin());
}
reverse_iterator rbegin()
{
return reverse_iterator(end());
}
reverse_iterator rend()
{
return reverse_iterator(begin());
}
list迭代器
list迭代器的实现
// 正向迭代器
typedef __list_iterator<T, T&, T*> iterator;
typedef __list_iterator<T, const T&, const T*> const_iterator;
// 正向迭代器
iterator begin()
{
return iterator(_head->_next);
}
iterator end()
{
return iterator(_head);
}
const_iterator begin() const
{
return const_iterator(_head->_next);
}
const_iterator end() const
{
return const_iterator(_head);
}
list反向迭代器的实现
反向迭代器为了对称把正向迭代器的end当成了反向迭代器的rbegin;把正向迭代器的begin当成了反向迭代器的rend。
// 反向迭代器
typedef Reverse_iterator<iterator, T&, T*> reverse_iterator;
typedef Reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;
// 反向迭代器
const_reverse_iterator rbegin() const
{
return const_reverse_iterator(end());
}
const_reverse_iterator rend() const
{
return const_reverse_iterator(begin());
}
reverse_iterator rbegin()
{
return reverse_iterator(end());
}
reverse_iterator rend()
{
return reverse_iterator(begin());
}
反向迭代器都是对正向迭代器的复用
反向迭代器------以下下代码可以粘贴到任意容器中,这样就可以一次性实现反向迭代器了
反向迭代器------以下下代码可以粘贴到任意容器中,这样就可以一次性实现反向迭代器了
//typedef Reverse_iterator<iterator, T&, T*> reverse_iterator;
//typedef Reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;
反向迭代器
//const_reverse_iterator rbegin() const
//{
// return const_reverse_iterator(end());
//}
//const_reverse_iterator rend() const
//{
// return const_reverse_iterator(begin());
//}
//reverse_iterator rbegin()
//{
// return reverse_iterator(end());
//}
//reverse_iterator rend()
//{
// return reverse_iterator(begin());
//}
};
// vector和list反向迭代器实现