欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-03 12:39:00
...

经过长时间的学习终于可以开始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_

相关标签: tinystl stl c++