tinystl实现(第九步:reserveseIterator.h)

39 篇文章 4 订阅
28 篇文章 36 订阅

经过长时间的学习终于可以开始tinystl的仿(chao)写工作了,本文参考了这位大佬得github,坦白讲我只是补充了注释,因为tinystl的代码真的非常经典而我又没什么这种大型项目的经验,所以只能这样做,不过相信能够有助于大家的学习
#强烈建议按顺序阅读本专栏
reserveseIterator.h中不仅仅只是实现了反向迭代器,其衍生部分bidirectional_iterator和random_access_iterator也在本文件有出现,迭代器的奥秘在我们面前展开
了解本篇你可能需要:
阅读这篇文章了解explicit

#pragma once
#ifndef  _REVERSE_ITERATOR_H_
#define _REVERSE_ITERATOR_H_

#include"Iterator.h"

namespace mySTL {
	template<class Iterator>
	class reverse_iterator_t {
	public:
		typedef Iterator iterator_type;
		typedef typename iterator_traits<Iterator>::iterator_category iterator_category;
		typedef typename iterator_traits<Iterator>::value_type value_type;
		typedef typename iterator_traits<Iterator>::difference_type difference_type;
		typedef typename iterator_traits<Iterator>::pointer pointer;
		typedef const pointer const_pointer;
		typedef typename iterator_traits<Iterator>::reference reference;
		typedef const reference const_reference;
	private:
		Iterator base_;
		Iterator cur_;
	public:
		//默认构造函数
		reverse_iterator_t():base_(0),cur_(0){}
		//explicit阻止隐式的类型转换,此函数只能被显式调用
		//构造函数
		explicit reverse_iterator_t(const iterator_type& it) : base(it) {
			auto temp = it;
			cur = --temp;//由于是逆向遍历,所以地址向前移动
		}
		//复制构造函数
		template<class Iter>
		reverse_iterator_t(const reverse_iterator_t<Iter>& rev_it) {
			base_ = (iterator_type)rev_it.base_();
			auto tmep = base_;
			cur = --temp;
		}

		iterator_type base() { return base_; }//返回反转后的最前端
		reference operator*() { return(*cur_); }//返回当前指针
		const_reference operator*()const { return (*cur_); }//对常迭代器返回当前指针
		pointer operator->() { return &(operator *()); }//返回当前指针的引用
		const_pointer operator->(){return &(operator*()) }//返回当前指针的引用
		reverse_iterator_t& operator ++() {
			--base_;
			--cur_;//由于是反向迭代器,所以向前反而是--
			return *this;
		}
		reverse_iterator_t& operator ++(int) {
			reverse_iterator_t temp = *this;
			++(*this);//对指针本身调用++(其实a++的本质是先保存a为temp然后调用++a最后返回temp)
			return temp;//返回之前的指针
		}
		reverse_iterator_t& operator --() {
			++base_;
			++cur_;//由于是反向迭代器,所以向前反而是--
			return *this;
		}
		reverse_iterator_t& operator --(int) {
			reverse_iterator_t temp = *this;
			--(*this);//对指针本身调用++(其实a++的本质是先保存a为temp然后调用++a最后返回temp)
			return temp;//返回之前的指针
		}
		reference operator[](difference_type n) {
			return base()[-n - 1];
		}
		reverse_iterator_t operator +(difference_type n)const;
		reverse_iterator_t operator -(difference_type n)const;
		reverse_iterator_t& operator +=(difference_type n);
		reverse_iterator_t& operator -=(difference_type n);
	private:
		//对于random_access_iterator和bidirectional_iterator进行额外处理
		//random_access_iterator可以直接跳转
		Iterator advanceNStep(Iterator it,
			difference_type n,
			bool right,
			random_access_iterator_tag) {
			if (right) {
				it += n;
			}
			else {
				it -= n;
			}
			return it;
		}
		//bidirectional_iterator必须一步一步移动
		Iterator advanceNStep(Iterator it,
			difference_type n,
			bool right,
			bidirectional_iterator_tag) {
			difference_type i;
			difference_type absN = n >= 0 ? n : -n;//绝对值

			if(right&&n>0)||(!right&&n<0{
				for(i=0;i!=absN;++i)
				it = it + 1;
			}
			else if(!right&&n > 0) || (right&&n < 0{
				for (i = 0; i != absN; ++i)
				it = it - 1;
				}
			return it;
		}
	public:
		template <class Iterator>
		friend bool operator == (const reverse_iterator_t<Iterator>& lhs,
			const reverse_iterator_t<Iterator>& rhs);
		template <class Iterator>
		friend bool operator != (const reverse_iterator_t<Iterator>& lhs,
			const reverse_iterator_t<Iterator>& rhs);
		template <class Iterator>
		friend bool operator < (const reverse_iterator_t<Iterator>& lhs,
			const reverse_iterator_t<Iterator>& rhs);
		template <class Iterator>
		friend bool operator <= (const reverse_iterator_t<Iterator>& lhs,
			const reverse_iterator_t<Iterator>& rhs);
		template <class Iterator>
		friend bool operator > (const reverse_iterator_t<Iterator>& lhs,
			const reverse_iterator_t<Iterator>& rhs);
		template <class Iterator>
		friend bool operator >= (const reverse_iterator_t<Iterator>& lhs,
			const reverse_iterator_t<Iterator>& rhs);

		template <class Iterator>
		friend reverse_iterator_t<Iterator> operator + (
			typename reverse_iterator_t<Iterator>::difference_type n,
			const reverse_iterator_t<Iterator>& rev_it);
		template <class Iterator>
		friend typename reverse_iterator_t<Iterator>::difference_type operator- (
			const reverse_iterator_t<Iterator>& lhs,
			const reverse_iterator_t<Iterator>& rhs);
	};

	template<class Iterator>
	reverse_iterator_t<Iterator>& reverse_iterator_t<Iterator>::operator+=(difference_type n) {
		base_ = advanceNStep(base_, n, false, iterator_category());
		cur_ = advanceNStep(cur_, n, false, iterator_category());
		return *this;
		//调用之前定义的泛型函数实现
	}
	template<class Iterator>
	reverse_iterator_t<Iterator>& reverse_iterator_t<Iterator>::operator-=(difference_type n) {
		base_ = advanceNStep(base_, n, true, iterator_category());
		cur_ = advanceNStep(cur_, n, true, iterator_category());
		return *this;
		//调用之前定义的泛型函数实现
	}
	//+/-调用+=/-=
	template<class Iterator>
	reverse_iterator_t<Iterator> reverse_iterator_t<Iterator>::operator+(difference_type n)const
	{
		reverse_iterator_t<Iterator>res = *this;
		res += n;
		return res;
	}
	template<class Iterator>
	reverse_iterator_t<Iterator> reverse_iterator_t<Iterator>::operator-(difference_type n)const
	{
		reverse_iterator_t<Iterator>res = *this;
		res -= n;
		return res;
	}
	//><==之类的运算符,都是一样的套路
	template <class Iterator>
	bool operator == (const reverse_iterator_t<Iterator>& lhs, const reverse_iterator_t<Iterator>& rhs) {
		return lhs.cur_ == rhs.cur_;
	}
	template <class Iterator>
	bool operator != (const reverse_iterator_t<Iterator>& lhs, const reverse_iterator_t<Iterator>& rhs) {
		return !(lhs == rhs);
	}
	template <class Iterator>
	bool operator < (const reverse_iterator_t<Iterator>& lhs, const reverse_iterator_t<Iterator>& rhs) {
		return lhs.cur_ < rhs.cur_;
	}
	template <class Iterator>
	bool operator > (const reverse_iterator_t<Iterator>& lhs, const reverse_iterator_t<Iterator>& rhs) {
		return lhs.cur_ > rhs.cur_;
	}
	template <class Iterator>
	bool operator >= (const reverse_iterator_t<Iterator>& lhs, const reverse_iterator_t<Iterator>& rhs) {
		return !(lhs < rhs);
	}
	template <class Iterator>
	bool operator <= (const reverse_iterator_t<Iterator>& lhs, const reverse_iterator_t<Iterator>& rhs) {
		return !(lhs > rhs);
	}
	//注意由于返回值这里的+-是不对称的!形式有很大区别!
	template <class Iterator>
	reverse_iterator_t<Iterator> operator+(
		typename reverse_iterator_t<Iterator>::difference_type n,
		const reverse_iterator_t<Iterator>& rev_it
		) {
		return rev_it + n;
	}
	template <class Iterator>
	typename reverse_iterator_t<Iterator>::difference_type operator - (
		const reverse_iterator_t<Iterator>& lhs,
		const reverse_iterator_t<Iterator>& rhs) {
		return lhs.cur_ - rhs.cur_;
	}
}
#endif // ! _REVERSE_ITERATOR_H

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值