Каталог статей
предисловие
Мы хотим написать общую симуляцию обратного итератора, и в случае обеспечения того, чтобы введение кода не было громоздким, в определенной степени использование нашего собственного смоделированного инкапсулированного итератора может упростить многие шаги.Прежде всего, нам нужно знать прямой Позиционные отношения между итераторами и обратными итераторами
1. Инкапсуляция обратного итератора (reverseiterator)
1. Конструктор
Iterator _it;
ReverseIterator(Iterator it)
//iterator这里回头传的是正向迭代器
:_it(it)
{
}
1 Операция разыменования.
typedef ReverseIterator<Iterator, Ref, Ptr> self;
Ref operator*() {
Iterator tmp(_it);
//因为从end()位置开始,所以要先--,
//获得新的位置,但不改变原来的_it
//所以建立一个临时对象对其进行--操作
return *(--tmo);
}
3. -> Перегрузка оператора
Ptr operator->() {
return &( operator*());
}
4. Фронт++, пост++
self& operator++() {
--_it;
//举例:从rbegin位置开始,也就是end()位置
//因为此时的位置无效要前一个位置才有效,所以先前置--
//反向迭代器的++就是正向迭代器的--
return *this;
}
self operator++(int) {
self tmp(*this);
--_it;
return tmp;
}
5. Передний –, Задний –
self& operator--() {
++_it;
return *this;
}
self operator--(int) {
self tmp(*this);
++_it;
return tmp;
}
6. Перегрузка оператора неравенства
bool operator!=(const self& s)const {
return _it!= s._it;
}
7. Полный код
namespace simulation {
template<class Iterator ,class Ref,class Ptr>
//相当于:
//typedef ReverseIterator<iterator, T&, T*> reverseiterator;
//typedef ReverseIterator<const_iterator, const T&, const T*> const_reverseiterator;
struct ReverseIterator {
Iterator _it;
ReverseIterator(Iterator it)
:_it(it)
{
}
typedef ReverseIterator<Iterator, Ref, Ptr> self;
Ref operator*() {
Iterator tmp(_it);
//因为从end()位置开始,所以要先--,
//获得新的位置,但不改变原来的_it
//所以建立一个临时对象对其进行--操作
return *(--tmo);
}
self& operator++() {
--_it;
//举例:从rbegin位置开始,也就是end()位置
//因为此时的位置无效要前一个位置才有效,所以先前置--
//反向迭代器的++就是正向迭代器的--
return *this;
}
self operator++(int) {
self tmp(*this);
--_it;
return tmp;
}
self operator--(int) {
self tmp(*this);
++_it;
return tmp;
}
self& operator--() {
++_it;
return *this;
}
Ptr operator->() {
return &( operator*());
}
bool operator!=(const self& s)const {
return _it!= s._it;
}
};
}
Два, rbegin () и rend ()
//先在vctor或者list的头文件中进行重定义
typedef ReverseIterator<iterator, T&, T*> reverseiterator;
typedef ReverseIterator<const_iterator, const T&, const T*> const_reverseiterator;
1.rbeign()
reverseiterator rbegin() {
//反向迭代器的开头对正向迭代器末尾进行操作
return reverseiterator(end());
}
const_reverseiterator rbegin()const {
return const_reverseiterator(end());
}
2.ренд()
reverseiterator rend() {
return reverseiterator(begin());
}
const_reverseiterator rend()const {
return const_reverseiterator(begin());
}