concept: 可想象成: 一组型别需求条件 或 一组描述某个型别的条件
model: 当 某个型别 满足所有这样的条件时, 我们便说 该型别 是 该concept的一个 model
iterator: 迭代器,即是 满足一定需求条件 的concept,iterator 不单单是一个concept,共5个不同的concept,即iterator的分类
- iterator的分类:input iterator, output iterator, forward iterator, bidirectional iterator, random access iterator
- iterator concept的阶层关系:
3. refinement:强化。 如果 concept 2 提供 concept 1 的所有功能,再加上 其他可能的额外功能, 我们便说 2 是 1 的 refinement。
4. 几个概念的区别:所谓 inheritance(继承)是 两个型别(type)之间的关系,所谓model是 一个 type 与 一组types之间的关系,所谓refinement 则是两组types之间的关系。
5. 5个STL iterator concept 都包含有各自的associated types(相关型别):如 value type(数值型别)、difference type(差距型别) 和 reference type(引用型别),pointer type(指针型别)。STL定义一个 iterator_traits 模板类 来把这些 associated types统一起来。iterator_traits的实现如下:
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;
};
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 _Tp>
struct iterator_traits<_Tp*> {
typedef random_access_iterator_tag iterator_category;
typedef _Tp value_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef _Tp& reference;
};
struct iterator_traits<_Tp*> {
typedef random_access_iterator_tag iterator_category;
typedef _Tp value_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef _Tp& reference;
};
template <class _Tp>
struct iterator_traits<const _Tp*> {
typedef random_access_iterator_tag iterator_category;
typedef _Tp value_type;
typedef ptrdiff_t difference_type;
typedef const _Tp* pointer;
typedef const _Tp& reference;
};
struct iterator_traits<const _Tp*> {
typedef random_access_iterator_tag iterator_category;
typedef _Tp value_type;
typedef ptrdiff_t difference_type;
typedef const _Tp* pointer;
typedef const _Tp& reference;
};
6. 算法 和 不同种类的iterator的重载定义,引入了iterator_tag标签参数 来区分重载。它们的唯一作用就是保证是独一无二的以便在函数重载机制上排上用场。iterator_tag在STL中被定义为5个空类,如下:
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 {};
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 {};
7. 每当你需要定义一个新的iterator的时候,你要确保它和iterator_traits运作得当,为此在你的新的iterator class中你要定义五个嵌套型别: value type(数值型别)、difference type(差距型别) 和 reference type(引用型别),pointer type(指针型别)和iterator_category(迭代器分类型别)。在STL中定义了如此的一个iterator基类,当定义新的iterator时,只需继承自iterator基类即可。iterator基类定义如下:
template <class _Category, class _Tp, class _Distance = ptrdiff_t,
class _Pointer = _Tp*, class _Reference = _Tp&>
struct iterator {
typedef _Category iterator_category;
typedef _Tp value_type;
typedef _Distance difference_type;
typedef _Pointer pointer;
typedef _Reference reference;
};
class _Pointer = _Tp*, class _Reference = _Tp&>
struct iterator {
typedef _Category iterator_category;
typedef _Tp value_type;
typedef _Distance difference_type;
typedef _Pointer pointer;
typedef _Reference reference;
};
8. 最后,当你定义新的算法时,要考虑算法需要的最小型别条件,来确定需要何种iterator。
/******************************************************************************************************************/
Iterator使得我们得以将容器(container)与作用其上的算法分离。
容器都具有iterators,容器提供该iterators访问元素的方法。
算法作用于iterators所形成的ranges上。
Iterator分类:
1. Trivial Iterator:可dereference并赋值,不提供迭代行为。
2. Input Iterator: 可dereference并赋值,可(前置或后置)累加,提供前向迭代行为,但不保证一定能够访问同一个Input Iterator两次。
3. Output Iterator: 可dereference并赋值(但返回结果不具备任何有用的值),可(前置或后置)累加,提供前向迭代行为,但不保证一定能够访问同一个Output Iterator两次。
4. Forward Iterator: 可dereference并赋值,可(前置或后置)累加,提供前向迭代行为,将一个Forward Iterator累加,不会造成旧值的副本无效。因此可以对同一个Forward Iterator遍历两次。
5. Bidirectional Iterator:除了符合Forward Iterator的特征之外,还可递减。
6. Random Access Iterator:除了符合Bidirectional Iterator的特征之外,还可向前或向后移动任意步数,还可比较两个Iterator的大小。它提供了与C指针类似的所以操作能力。