首页 > 代码库 > 迭代器概念
迭代器概念
//迭代器是一种smart pointertemplate<typename T>class ListItem{public: T value()const { return _value; } ListItem *next()const { return _next; }private: T _value; ListItem *_next;};template<class T>class List{public: void insert_front(T value); void insert_end(T value); void display(ostream&os = cout)const;private: ListItem<T>*_end; ListItem<T>*_front; long _size;};//为链表设计一个迭代器,要设计迭代器,必须要对容器有足够的了解//所以list和对应的迭代器的设计都由list的设计者实现,从而封装实现细节template<class Item>struct ListIter{ Item *ptr;//保持与容器之间的一个联系,ptr是list结点指针 ListIter(Item *p = 0) :ptr(p){} //迭代器行为类似指针,其中最常见的操作是内容提领和成员访问 //所以要对operator*和operator->进行重载,可参考auto_ptr的实现 Item& operator*()const { return *ptr; } //重构->,返回值必须为一个指针或可以应用 -> 操作的类型 Item* operator->()const { return ptr; } //前增量,返回引用(迭代器对象) ListIter& operator++() { ptr = ptr->next(); return *this; } //后增量,返回值 ListIter operator++(int) { ListIter tmp = *this; ++*this;//利用前面对++的重载 return tmp; } bool operator==(const ListIter& i)const { return ptr == i.ptr; } bool operator!=(const ListIter& i)const { return ptr != i.ptr; }};
//如何获取迭代器所指类型template<class T>struct MyIter{ typedef T value_type;//迭代器所指对象类型 T *ptr; //....};template<class I>//函数func接受一个迭代器参数,返回值是迭代器所指对象类型//typename告诉编译器I是一个类型,使得能够通过编译typename I::value_type func(I ite){ return *ite;}//类模板用于萃取迭代器特性,I为迭代器类型template<class I>struct iterator_traits{ typedef typename I::value_type value_type;//针对class};//原生指针不是class,无法定义内嵌型别//traits可以拥有特化版本,T *为原生指针int *,则T也就是value_type为inttemplate<class T>struct iterator_traits<T*>{ typedef T value_type;//针对原生指针};//萃取机完整版本(最常用到的迭代器五种类型)//若使容器能与STL兼容,必须要为容器的迭代器定义以下五种相应型别template <class I>struct iterator_traits{ typedef typename I::iterator_category iterator_category;//迭代器类型 typedef typename I::value_type value_type;//迭代器所指对象的类型 typedef typename I::difference_type difference_type;//两个迭代器之间的距离 typedef typename I::pointer pointer;//迭代器所指对象的指针 typedef typename I::reference reference;//迭代器所指对象的引用};/*迭代器有五种类型,Input Iterator,output Iterator,Forward Iterator只支持++,Biderectional Iterator支持++、--,Random Access Iterator支持所有运算,效率最高*/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 InputIterator,class Distance>inline void _advance(InputIterator& i, Distance n, input_iterator_tag){ while (n--) i++;}//下面四个函数类似,不再详述//对外开放的接口, iterator_traits<InputIterator>::iterator_category()将产生一个暂时对象,编译器根据对象//类型决定调用哪一个_advance重载函数//STL一个命名规则:以算法所能接受的最低阶迭代器类型来为其迭代器类型参数命名template<class InputIterator,class Distance>inline void advance(InputIterator& i, Distance n){ _advance(i, n, iterator_traits<InputIterator>::iterator_category());}
为了符合规范,任何迭代器都应该提供五个内嵌类型,以利于traits萃取,否则可能无法与其他STL组件顺利搭配。STL提供了一个iterators class如下,可让每个新设计的迭代器都继承自它。
//ptrdiff_t为c++内建类型,定义于<cstddef>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 Pointer pointer; typedef Reference reference;};
迭代器概念
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。