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_
上一篇: spring bean的三种实例化方式 (xml方式)
下一篇: 再一次测试