STL源码剖析(3):迭代器(iterators)

  关于迭代器的基本介绍可以看我之前泛型编程的文章:   STL的中心思想在于:将数据容器(containers)和算法(algorithms)分开,彼此独立设计,最后再以一帖粘合剂将它们撮合在一起。   迭代器(iterator)是一种 smart pointer,关于智能指针可以看我之前的文章(智能指针)。    迭代器是一种行为类似指针的对象,而指针的各种行为中最常见也最重要的便是内容提领(dereference)和成员访问(member access),因此,迭代器最重要的编程工作就是对 operator* 和 operator-> 进行重载(overloading)工作。    相信用过STL容器的都知道,每一种STL容器都提供有专属迭代器。迭代器作为这么重要的东东,为什么独立成体,因为迭代器的操作严重依赖容器自身操作特性。    这部分基本内容前面文章都有介绍,,这里看下其代码:

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 Tvalue_type; typedef Distancedifference_type; typedef T*pointer; typedef T&reference;};struct output_iterator { typedef output_iterator_tag iterator_category; typedef voidvalue_type; typedef voiddifference_type; typedef voidpointer; typedef voidreference;};template <class T, class Distance> struct forward_iterator { typedef forward_iterator_tag iterator_category; typedef Tvalue_type; typedef Distancedifference_type; typedef T*pointer; typedef T&reference;};template <class T, class Distance> struct bidirectional_iterator { typedef bidirectional_iterator_tag iterator_category; typedef Tvalue_type; typedef Distancedifference_type; typedef T*pointer; typedef T&reference;};template <class T, class Distance> struct random_access_iterator { typedef random_access_iterator_tag iterator_category; typedef Tvalue_type; typedef Distancedifference_type; typedef T*pointer; typedef T&reference;};#ifdef __STL_USE_NAMESPACEStemplate <class Category, class T, class Distance = ptrdiff_t,class Pointer = T*, class Reference = T&>struct iterator { typedef Category iterator_category; typedef Tvalue_type; typedef Distance difference_type; typedef Pointer pointer; typedef Reference reference;};<class Iterator>struct iterator_traits { typedef typename Iterator::iterator_category iterator_category; typedef typename Iterator::value_typevalue_type; typedef typename Iterator::difference_type difference_type; typedef typename Iterator::pointerpointer; typedef typename Iterator::referencereference;};template <class T>struct iterator_traits<T*> { typedef random_access_iterator_tag iterator_category; typedef Tvalue_type; typedef ptrdiff_tdifference_type; typedef T*pointer; typedef T&reference;};template <class T>struct iterator_traits<const T*> { typedef random_access_iterator_tag iterator_category; typedef Tvalue_type; typedef ptrdiff_tdifference_type; typedef const T*pointer; typedef const T&reference;};template <class Iterator>inline typename iterator_traits<Iterator>::iterator_categoryiterator_category(const Iterator&) { typedef typename iterator_traits<Iterator>::iterator_category category; return category();}template <class Iterator>inline typename iterator_traits<Iterator>::difference_type*distance_type(const Iterator&) { return static_cast<typename iterator_traits<Iterator>::difference_type*>(0);}template <class Iterator>inline typename iterator_traits<Iterator>::value_type*value_type(const Iterator&) { return static_cast<typename iterator_traits<Iterator>::value_type*>(0);}#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */template <class T, class Distance> inline input_iterator_tag iterator_category(const input_iterator<T, Distance>&) { return input_iterator_tag();}inline output_iterator_tag iterator_category(const output_iterator&) { return output_iterator_tag();}template <class T, class Distance> inline forward_iterator_tagiterator_category(const forward_iterator<T, Distance>&) { return forward_iterator_tag();}template <class T, class Distance> inline bidirectional_iterator_tagiterator_category(const bidirectional_iterator<T, Distance>&) { return bidirectional_iterator_tag();}template <class T, class Distance> inline random_access_iterator_tagiterator_category(const random_access_iterator<T, Distance>&) { return random_access_iterator_tag();}template <class T>inline random_access_iterator_tag iterator_category(const T*) { return random_access_iterator_tag();}一个人负心,或许是因为他的记忆力不好。

STL源码剖析(3):迭代器(iterators)

相关文章:

你感兴趣的文章:

标签云: