一、反向迭代器模拟实现
1.实现思想
通过对泛型正向迭代器的封装实现一个反向迭代器的类,使得反向迭代器的begin等于正向迭代器的end,end等于正向迭代器的begin;
*操作符重载,由于begin指向的是正向的end,所以不能直接返回值,要返回当前迭代器的下一个位置的值,但是不能直接改变当前迭代器的位置,所以构造一个正向迭代器对象减减后返回即可.
反向迭代器的++等于正向迭代器的–,–等于正向迭代器的++;
因为有const迭代器所以增加两个模板参数控制val的属性
_iterator.h
#pragma once
namespace kxj
{
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 it = _it;
--it;
return *it;
}
self& operator++()
{
--_it;
return *this;
}
self& operator--()
{
++_it;
return *this;
}
self operator++(int)
{
self tmp(_it);
--_it;
return tmp;
}
self operator--(int)
{
self tmp(_it);
++_it;
return tmp;
}
bool operator!=(const self& s)
{
return _it != s._it;
}
bool operator==(const self& s)
{
return _it == s._it;
}
};
}
反向迭代器是一个泛型的迭代器,所有容器都可以复用
vector.h
template <class T>
class vector
{
typedef T* iterator;
typedef const T* const_iterator;
typedef kxj::reverseIterator<iterator, T&, T*> reverse_iterator;
typedef kxj::reverseIterator<iterator, const T&, const T*> const_reverse_iterator;
reverse_iterator rbegin()
{
return _finish;
}
reverse_iterator rend()
{
return _start;
}
const_reverse_iterator rbegin()const
{
return _finish;
}
const_reverse_iterator rend()const
{
return _start;
}
};
list.h
template <class T>
class list
{
typedef listIterator<T, T&, T*> iterator;
typedef listIterator<T, const T&, const T*> const_iterator;
typedef kxj::reverseIterator<iterator, T&, T*> reverse_iterator;
typedef kxj::reverseIterator<iterator, const T&, const T*> const_reverse_iterator;
reverse_iterator rbegin()
{
/*○(尾)<-->1(头)<-->2<-->3 */
return reverse_iterator(_phead);
}
reverse_iterator rend()
{
return reverse_iterator(_phead->_next);
}
const_reverse_iterator rbegin() const
{
return const_reverse_iterator(_phead);
}
const_reverse_iterator rend() const
{
return const_reverse_iterator(_phead->_next);
}
};