迭代器型别
- value type 值类型,是指迭代器所知物件的型别
- difference type 相差型别,表示两个迭代器之间的距离
- reference type 引用类型,从迭代器所指之物的内容是否允许改变
- pointer type 指针类型,迭代器所指之物的地址
- iterator_category 迭代器的相应型别
迭代器类型
- Input Iterator 只读迭代器
- Output Iterator 可写迭代器
- Forward Iterator 正向迭代器
- Bidirectional Iterator 双向迭代器
- Random Access Iterator 随机性迭代器
迭代器萃取
my_iterator.h
namespace zyq
{
typedef int ptrdiff_t;
struct input_itertaor_tag{};
struct output_iterator_tag{};
struct forward_iterator_tag :public input_itertaor_tag {};
struct bidirectional_iterator_tag:public forward_iterator_tag{};
struct random_access_iterator_tag:public bidirectional_iterator_tag{};
template<class _C,class _Ty,class _D = ptrdiff_t,class _Pointer = _Ty*,class _Reference = _Ty&>
struct iterator //全局迭代器类型
{
typedef _C iterator_category; //迭代器类型
typedef _Ty value_type; //迭代器所指类型
typedef _D difference_type; //差值
typedef _Pointer pointer; //指针
typedef _Reference reference; //引用
};
template<class _Iterator>
struct iterator_traits //迭代器萃取
{
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 _Ty, class _D>
struct _Forit :public iterator<forward_iterator_tag, _Ty, _D> {};
//双向迭代器
template<class _Ty,class _D>
struct _Bidit :public iterator<bidirectional_iterator_tag, _Ty, _D> {};
//随机迭代器
template<class _Ty, class _D>
struct _Ranit :public iterator<random_access_iterator_tag, _Ty, _D> {};
template<class _II,class _D>
inline void __advance(_II& i, _D n, input_itertaor_tag)
{
//while (n--) ++i;
}
template<class _BI, class _D>
inline void __advance(_BI& i, _D n, bidirectional_iterator_tag)
{
/*
if (n >= 0)
{
while (n--) ++i;
}
else
{
while (n++) --i;
}
*/
}
template<class _RAI, class _D>
inline void __advance(_RAI& i, _D n, random_access_iterator_tag)
{
//i += n;
}
template<class _II,class _D>
inline void advance(_II& i, _D n)
{
iterator_traits<_II>();
typedef typename iterator_traits<_II>::iterator_category cate;
__advance(i, n, cate());//类型名加括号 即对象
}
}
my_vector.h
#include"my_iterator.h"
namespace zyq
{
template<class _Ty>
class my_vevtor
{
public:
class iterator;
class const_iterator;
class const_iterator :public zyq::_Ranit<int, int> {};
class iterator :public const_iterator {};
};
}
my_list.h
#include"my_iterator.h"
namespace zyq
{
template<class _Ty>
class my_list
{
public:
class iterator;
class const_iterator;
class const_iterator :public zyq::_Bidit<int, int>{};
class iterator :public const_iterator {};
};
}
my_hash.table.h
#include"my_iterator.h"
namespace zyq
{
template<class _Ty>
class my_hash_table
{
public:
class iterator;
class const_iterator;
class const_iterator :public zyq::_Forit<_Ty, int> {};
class iterator : public const_iterator {};
};
}
#include"my_iterator.h"
#include"my_list.h"
#include"my_vector.h"
#include"my_hash_table.h"
using namespace std;
int main()
{
zyq::my_list<int>::iterator it;
zyq::my_vevtor<int>::iterator iv;
zyq::my_hash_table<int>::iterator ih;
zyq::advance(it, 5);
zyq::advance(iv, 5);
zyq::advance(ih, 5);
return 0;
}
首先在调动yhp::advance(it,5);
it 迭代器不断向上继承,最终继承为双向迭代器,并将其赋给 iterator_category
接着进入函数本体,iterator_traits<_II>::iterator_category cate;
进行迭代器萃取,根据上一步我们获得了iterator_category就是一个双向迭代器类型
接着调动__advance()
函数本身,将双向迭代器类型传入,根据函数重载去使用双向迭代器的函数