一、迭代器概要
1.迭代器依附于容器,没有独立而泛用的迭代器
2.迭代器是一种smart pointer,迭代器最重要的编程工作是重载operator* 和operator ->
3.原生指针也是迭代器
4.设计适当的相应型别是迭代器的责任;设计适当的迭代器则是容器的责任
二、迭代器的相应型别
value type 所指对象型别
difference type 两个迭代器之间的距离
pointer 所指对象的指针型别
reference 引用型别
iterator catagoly 种类型别
三、迭代器的类型
对于STL数据结构和算法,你可以使用五种迭代器。下面简要说明了这五种类型:
Input iterators 提供对数据的只读访问。
Output iterators 提供对数据的只写访问
Forward iterators 提供读写操作,并能向前推进迭代器。
Bidirectional iterators 提供读写操作,并能向前和向后操作。
Random access iterators 提供读写操作,并能在数据中随机移动。
四、萃取技术(traits)
1.并非所有迭代器都是类类型(class type)。原生指针就不是。如果不是class type就无法定义内嵌型别。单STL必须接受原生指针为迭代器。
2.traits编程技法很棒,适度弥补了C++语言本身的不足。STL只对迭代器加以规范,制作出iterator_traits这样的东西。SGI STL把这种技法进一步扩大到迭代器以外的世界,于是有了所谓的__type_traits。双底线前缀表示SGI内部所用的东西,不在STL标准规范之内。
3.萃取类
Template <class I>
struct iterator_traits
{
typedef typename I:value_type value_type;
}
偏特化版本(原生指针)
-->原生指针会自动匹配到这个模板
Template <class T>
struct iterator_traits<T*>
{
typedef T value_type;
}
偏特化版本(pointer-to-const)
-->const原生指针会自动匹配到这个模板
Template <class T>
struct iterator_traits<const T*>
{
typedef T value_type;
}
完整版萃取类
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; // 指针类型之间的距离一定是整型(ptrdiff_t被定义为int型)
typedef T* pointer;
typedef T& reference;
};
完整版之pointer-to-const -->const原生指针会自动匹配到这个模板
template <class T>
struct iterator_traits<const T*> {
typedef random_access_iterator_tag iterator_category; // 指针类型是可以随机访问的
typedef T value_type; // 值类型
typedef ptrdiff_t difference_type; // 指针类型之间的距离一定是整型(ptrdiff_t被定义为int型)
typedef T* pointer;
typedef T& reference;
};