tinystl实现(第五步:itearator.h)

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

经过长时间的学习终于可以开始tinystl的仿(chao)写工作了,本文参考了这位大佬的github,坦白讲我只是补充了注释,因为tinystl的代码真的非常经典而我又没什么这种大型项目的经验,所以只能这样做,不过相信能够有助于大家的学习
#强烈建议按顺序阅读本专栏
迭代器是stl中各种容器实现的重中之重,我们发现平时常用的iterator居然又如此多种不同的必要形态,确实非常有趣
关于不同itearator的区别:查看这个文档

#pragma once
#ifndef _ITEARATOR_H_
#define _ITEARATOR_H_
#include<stddef.h>
namespace mySTL {

	struct input_iterator_tag {};//只读且读后往后移动
	struct output_iterator_tag {};//只写且写后往后移动
	struct forward_iterator_tag :public input_iterator_tag {};//可以从前往后遍历的指针
	struct bidirectional_iterator_tag : public forward_iterator_tag {};//从两个方向都可以遍历的指针
	struct random_access_iterator_tag : public bidirectional_iterator_tag {};//提供和指针相同的功能,换而言之它可以跳跃而不是逐个遍历

	template <class T, class Distance> struct input_iterator
	{
		typedef input_iterator_tag iterator_category;//迭代器本身
		typedef T value_type;//定义类型
		typedef Distance difference_type;//大小
		typedef T* pointer;//定义指针
		typedef T& reference;//定义引用
	};
	struct output_iterator
	{
		typedef output_iterator_tag iterator_category;
		typedef void value_type;
		typedef void difference_type;
		typedef void pointer;
		typedef void reference;
	};
	template <class T, class Distance> struct forward_iterator
	{
		typedef forward_iterator_tag iterator_category;
		typedef T value_type;
		typedef Distance difference_type;
		typedef T* pointer;
		typedef T& reference;
	};
	template <class T, class Distance> struct bidirectional_iterator
	{
		typedef bidirectional_iterator_tag iterator_category;
		typedef T value_type;
		typedef Distance difference_type;
		typedef T* pointer;
		typedef T& reference;
	};
	template <class T, class Distance> struct random_access_iterator
	{
		typedef random_access_iterator_tag iterator_category;
		typedef T value_type;
		typedef Distance difference_type;
		typedef T* pointer;
		typedef T& reference;
	};
	template<class Category, class T, class Distance = ptrdiff_t,
		class Pointer = T * , class Reference = T & >
		struct iterator
	{
		typedef Category iterator_category;
		typedef T value_type;
		typedef Distance difference_type;
		typedef T* pointer;
		typedef T& reference;
	};
	template<class Iterator>
	struct iterator_traits
	{
		typedef typename Iterator::iterator_category iterator_category;
		typedef typename Iterator::value_type value_type;
		typedef typename Iterator::difference_type difference_type;
		typedef typename Iterator::pointer pointer;
		typedef typename Iterator::reference reference;
	};
	template<class T>
	struct iterator_traits<T*>
	{
		typedef random_access_iterator_tag iterator_category;
		typedef T value_type;
		typedef ptrdiff_t difference_type;
		typedef T* pointer;
		typedef T& reference;
	};
	template<class T>
	struct iterator_traits<const T*>
	{
		typedef random_access_iterator_tag iterator_category;
		typedef T value_type;
		typedef ptrdiff_t difference_type;
		typedef T* pointer;
		typedef T& reference;
	};
	//以下三条函数均使用强制转型提取iterator中的元素
	template<class Iterator>
	inline typename  iterator_traits<Iterator>::iterator_category
		iterator_category(const Iterator& It) {
		typedef typename iterator_traits<Iterator>::iterator_category category;
			return category();
	}
	template<class Iterator>
	inline typename  iterator_traits<Iterator>::value_type*
		value_type(const Iterator& It) {
		return static_cast<typename iterator_traits<Iterator>::value_type*>(0);
	}
	template<class Iterator>
	inline typename  iterator_traits<Iterator>::diffence_type*
		diffence_type(const Iterator& It) {
		return static_cast<typename iterator_traits<Iterator>::diffence_type*>(0);
	}
}
#endif // !_ITEARATOR_H_

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值