Boost C++ 库

……世界上最受推崇且设计最专业的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu,《C++ 编码规范

迭代器外观和适配器 - Boost C++ 函数库

迭代器外观和适配器

作者 David Abrahams, Jeremy Siek, Thomas Witt
联系方式 dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com
组织 Boost Consulting, Indiana University 开放系统实验室, Zephyr Associates, Inc.
日期 2006-09-11
编号这是N1530=03-0113的修订版本,该版本已被C++标准委员会库工作组接受为技术报告1。
版权Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
摘要我们提出了一组类模板,它们帮助程序员从头开始构建或通过适配其他迭代器来构建符合标准的迭代器。

动机

迭代器在现代 C++ 编程中扮演着重要的角色。迭代器是标准库算法的中心抽象,它允许算法在各种上下文中重用。C++ 标准库包含各种有用的迭代器。每个标准容器都带有常量迭代器和可变迭代器2,以及这些迭代器的反向版本,它们沿相反方向遍历容器。标准库还提供istream_iteratorandostream_iterator用于从流中读取和写入流,insert_iterator, front_insert_iteratorandback_insert_iterator用于向容器中插入元素,以及raw_storage_iterator用于初始化原始内存 [7]。

尽管标准库提供了许多迭代器,但仍缺少显而易见且有用的迭代器,创建新的迭代器类型对于 C++ 程序员来说仍然是一项常见任务。文献中记录了其中一些,例如 line_iterator [3] 和 Constant_iterator [9]。迭代器抽象功能如此强大,我们预计程序员将始终需要发明新的迭代器类型。

尽管创建“几乎”符合标准的迭代器很容易,但迭代器要求中包含的细微之处使得创建“真正”符合标准的迭代器变得相当困难。此外,迭代器接口丰富,包含许多在技术上冗余且实现起来乏味的操作符。为了自动化构建迭代器的重复工作,我们提议iterator_facade一个迭代器基类模板,它提供了标准迭代器丰富的接口,并将其实现委托给派生类的成员函数。除了减少创建迭代器所需的代码量之外,iterator_facade还提供编译时错误检测。迭代器实现中常常被忽视的错误会转化为编译时错误,因为派生类实现必须符合iterator_facade.

的预期。迭代器构建的一种常见模式是适配一个迭代器以形成一个新的迭代器。迭代器的功能由四个正交方面组成:遍历、间接引用、等值比较和距离测量。适配旧迭代器以创建新迭代器通常可以节省工作,因为可以重用功能的一个方面,同时重新定义另一个方面。例如,标准库提供了reverse_iterator,它通过反转其遍历方向来适配任何双向迭代器。与普通迭代器一样,标准库之外定义的迭代器适配器在文献中已变得司空见惯

  • Checked iter[13] 为现有迭代器添加了边界检查。
  • View Template Library[14] 的迭代器(它适配容器)本身就是底层迭代器的适配器。
  • Smart iterators [5] 通过将函数对象应用于被引用的对象并返回结果来适配迭代器的解引用行为。
  • Custom iterators [4],其中列举了各种适配器类型。
  • Compound iterators [1],它访问容器的容器中的一个切片。
  • MTL [12] 中的几个迭代器适配器。MTL 包含一个步进迭代器,其中每次调用operator++()会将迭代器向前移动某个常数因子,以及一个缩放迭代器,它将解引用值乘以某个常数。
[1]我们使用术语“概念”来指代类型必须满足的一组要求,以便与特定的模板参数一起使用。
[2]术语“可变迭代器”指的是对可以通过赋值给解引用迭代器来更改的对象进行迭代的迭代器,而“常量迭代器”指的是对不能修改的对象进行迭代的迭代器。

为了满足构建适配器的需求,我们提出了iterator_adaptor类模板。的实例化iterator_adaptor作为新迭代器的基类,提供将所有操作转发到底层迭代器的默认行为。用户可以在派生迭代器类中选择性地替换这些特性。本提案还包括许多更专业的适配器,例如transform_iterator在迭代器解引用期间应用某个用户指定函数。

对标准的影响

本提案纯粹是对 C++ 标准库的补充。但是,请注意,本提案依赖于新迭代器概念的提案。

设计

迭代器概念

本提案是根据新的迭代器 概念制定的,如n1550中提出的,因为用户定义,尤其是适配的迭代器,受到当前迭代器类别固有的众所周知的分类问题的困扰。

本提案不严格依赖于提案n1550,因为新旧类别之间存在直接映射。如果n1550未被接受,本提案可以使用此映射进行重新制定。

互操作性

迭代器互操作性问题在当前标准中处理得不好。目前有两个缺陷报告涉及互操作性问题。

问题179涉及可变容器迭代器类型仅要求可转换为相应的常量迭代器类型,但这些类型的对象在比较或减法表达式中不要求互操作。这种情况在实践中很繁琐,并且与内置类型的工作方式不符。本提案实现了对问题179的提议解决方案,正如大多数标准库实现现在所做的那样。换句话说,如果迭代器类型 A 具有隐式或用户定义的转换为迭代器类型 B 的转换,则迭代器类型是可互操作的,并且可以使用通常的一组操作符。

问题280涉及当前反向迭代器类型之间互操作性的缺乏。提议的新 reverse_iterator 模板解决了 280 中提出的问题。它提供了所需的互操作性,而不会引入不需要的重载。

迭代器外观

尽管迭代器接口非常丰富,但有一个核心子集是所有功能所必需的。我们已经确定了迭代器的以下核心行为:

  • 解引用
  • 递增
  • 递减
  • 相等比较
  • 随机访问移动
  • 距离测量

除了上述行为外,核心接口元素还包括通过迭代器特征暴露的关联类型value_type, reference, difference_typeiterator_category.

迭代器外观使用好奇重复模板模式 (CRTP) [Cop95],以便用户可以指定iterator_facade以前的设计使用策略对象来指定行为,但由于几个原因,该方法已被放弃:

  1. 策略对象的创建和最终复制可能会产生开销,而当前方法可以避免这种开销。
  2. 策略对象方法不允许对创建的迭代器类型进行自定义构造函数,这对于iterator_facade在其他库实现中使用是必不可少的。
  3. 如果未使用 CRTP,则标准要求迭代器的operator++返回迭代器类型本身,这将意味着所有使用该库构建的迭代器都必须是iterator_facade<...>的特化,而不是更具描述性的名称,如indirect_iterator<T*>。需要笨拙的类型生成元函数来构建新的参数化迭代器,并且一个单独的iterator_adaptor层将是不可能的。

用法

The user ofiterator_facade将他的迭代器类派生自iterator_facade的特化,并将派生迭代器类作为iterator_facade的第一个模板参数。其他模板参数的顺序经过精心挑选,以便利用有用的默认值。例如,在定义常量左值迭代器时,用户可以传递迭代器的 const 限定版本value_typeiterator_facade参数,并省略后面的参考参数。

的行为。派生迭代器类必须定义实现迭代器核心行为的成员函数。下表描述了根据派生迭代器类型类别要求有效的表达式。这些成员函数将在下文简要描述,并在迭代器外观要求中更详细地描述。

表达式 效果
i.dereference() 访问被引用的值
i.equal(j) 比较相等性与j
i.increment() 向前移动一个位置
i.decrement() 向后移动一个位置
i.advance(n) 前进n位置
i.distance_to(j) 测量到j

的距离。除了实现核心接口函数外,派生自iterator_facade的迭代器通常会定义几个构造函数。为了模拟任何标准迭代器概念,迭代器至少必须有一个复制构造函数。此外,如果迭代器类型X旨在与另一个迭代器类型自动互操作Y(例如常量迭代器和可变迭代器)那么必须有一个从XY或从YX(但不是两者)的隐式转换,通常实现为转换构造函数。最后,如果迭代器要模拟 Forward Traversal Iterator 或更精细的迭代器概念,则需要默认构造函数。

迭代器核心访问

iterator_facade并且操作符实现需要能够访问派生类中的核心成员函数。将核心成员函数公开会向用户暴露实现细节。此处使用的设计确保实现细节不会出现在派生迭代器类型的公共接口中。

防止直接访问核心成员函数有两个优点。首先,用户不可能在打算使用 value_type 的成员时意外地使用迭代器的成员函数。这在过去的智能指针实现中一直是一个问题。第二个也是主要的优点是,库实现者可以自由地用基于iterator_facade的实现,而无需担心破坏直接访问公共核心成员函数的代码。

在朴素实现中,将派生类的核心成员函数保持为 private 将需要授予iterator_facade和所有七个运算符的友元关系。为了减轻限制访问的负担,iterator_core_access被提供,这是一个充当派生迭代器类中核心成员函数网关的类。派生类的作者只需授予iterator_core_access友元关系即可使其核心成员函数可供库使用。

iterator_core_access通常实现为空类,仅包含调用迭代器核心成员函数的私有静态成员函数。但是,没有必要标准化网关协议。请注意,即使iterator_core_access使用了 public 成员函数,也不会打开安全漏洞,因为每个核心成员函数都保留了迭代器的不变量。

operator[]

通用迭代器的索引运算符提出了特殊挑战。随机访问迭代器的operator[]仅要求返回可转换为其value_type的实现替换手动编写的迭代器实现。要求它返回一个左值将排除目前合法的随机访问迭代器,这些迭代器将引用值保存在数据成员中(例如counting_iterator),因为*(p+n)是临时迭代器p+n的一个引用,该临时迭代器在operator[]返回时被销毁。

使用iterator_facade实现了对问题 299 的首选解决方案所要求的语义,并被提案n1550采纳:p[n]的结果是一个可转换为迭代器value_typep[n] = x等效于*(p + n) = x(注意:此结果对象可能实现为包含p+n副本的代理)。这种方法将适用于任何随机访问迭代器,而与其实施的其他细节无关。知道其迭代器实现细节的用户可以自由地在派生迭代器类中实现一个operator[],它返回一个左值;它将隐藏由iterator_facade提供的那个,使其对她的迭代器的客户端可用。

operator->

reference可读迭代器(以及今天的输入迭代器)的类型不必是引用,只要它可以转换为迭代器的value_type即可。但是,当value_type是类时,仍然必须能够通过operator->访问成员。因此,其reference类型实际上不是引用的迭代器必须从其operator->.

返回一个包含被引用值副本的代理。iterator_facadeoperator->andoperator[]的返回类型没有明确指定。相反,这些类型根据一组要求进行描述,这些要求必须由iterator_facade实现。

[Cop95][Coplien, 1995] Coplien, J., Curiously Recurring Template Patterns, C++ Report, February 1995, pp. 24-27。

迭代器适配器

iterator_adaptorclass template adapts someBase3类型的结果,以创建新迭代器。的实例化iterator_adaptorare derived from a corresponding instantiation ofiterator_facadeand implement the core behaviors in terms of theBasetype. In essence,iterator_adaptormerely forwards all operations to an instance of theBasetype, which it stores as a member.

[3]这里的术语“Base”不是指基类,也不意味着暗示使用派生。我们遵循了标准库的惯例,它提供了一个 base() 函数来访问reverse_iteratoradaptor.

The user ofiterator_adaptorcreates a class derived from an instantiation ofiterator_adaptorand then selectively redefines some of the core member functions described in theiterator_facadecore requirements table. TheBasetype need not meet the full requirements for an iterator; it need only support the operations used by the core interface functions ofiterator_adaptorthat have not been redefined in the user's derived class.

Several of the template parameters ofiterator_adaptordefault touse_default的底层迭代器对象。这允许用户即使希望稍后在参数列表中指定参数,也可以使用默认参数。此外,相应关联类型的默认值有些复杂,因此需要元编程来计算它们,并且use_defaultcan help to simplify the implementation. Finally, the identity of theuse_defaulttype is not left unspecified because specification helps to highlight that the参考template parameter may not always be identical to the iterator'sreferencetype, and will keep users from making mistakes based on that assumption.

专用适配器

本提案还包含几个专用适配器的示例,这些适配器使用iterator_adaptor:

  • indirect_iterator可以轻松实现,它遍历迭代器、指针或智能指针并应用额外的解引用级别。
  • 一个新的reverse_iterator,它反转 Base 迭代器的运动方向,同时允许适配的常量迭代器和可变迭代器以预期的方式交互(与大多数 C++98 实现中的不同)。
  • transform_iterator,它在解引用时将用户定义的函数对象应用于底层值。
  • filter_iterator,它提供了一个迭代器范围视图,其中底层范围的某些元素被跳过。
  • counting_iterator,它适配任何可增量类型(例如整数、迭代器),使得适配迭代器的增量/减量和解引用产生 Base 类型的连续值。
  • function_output_iterator,它使得创建自定义输出迭代器变得更加容易。

根据 Boost 库中的示例,用户已经生成了许多新的适配器,其中包括一个排列适配器,它对随机访问迭代器应用某种排列,以及一个步进适配器,它通过将随机访问迭代器的移动单位乘以一个常数因子来适配它。此外,Boost Graph Library (BGL) 使用迭代器适配器来适配其他图库,例如 LEDA [10] 和 Stanford GraphBase [8],以适应 BGL 接口(这需要符合 C++ 标准的迭代器)。

提议文本

头文件<iterator_helper>概述 [lib.iterator.helper.synopsis]

struct use_default;

struct iterator_core_access { /* implementation detail */ };

template <
    class Derived
  , class Value
  , class CategoryOrTraversal
  , class Reference  = Value&
  , class Difference = ptrdiff_t
>
class iterator_facade;

template <
    class Derived
  , class Base
  , class Value      = use_default
  , class CategoryOrTraversal  = use_default
  , class Reference  = use_default
  , class Difference = use_default
>
class iterator_adaptor;

template <
    class Iterator
  , class Value = use_default
  , class CategoryOrTraversal = use_default
  , class Reference = use_default
  , class Difference = use_default
>
class indirect_iterator;

template <class Dereferenceable>
struct pointee;

template <class Dereferenceable>
struct indirect_reference;

template <class Iterator>
class reverse_iterator;

template <
    class UnaryFunction
  , class Iterator
  , class Reference = use_default
  , class Value = use_default
>
class transform_iterator;

template <class Predicate, class Iterator>
class filter_iterator;

template <
    class Incrementable
  , class CategoryOrTraversal  = use_default
  , class Difference = use_default
>
class counting_iterator;

template <class UnaryFunction>
class function_output_iterator;

迭代器外观 [lib.iterator.facade]

iterator_facade是一个基类模板,它根据派生迭代器类提供的几个核心函数和关联类型来实现标准迭代器的接口。

类模板iterator_facade

template <
    class Derived
  , class Value
  , class CategoryOrTraversal
  , class Reference  = Value&
  , class Difference = ptrdiff_t
>
class iterator_facade {
 public:
    typedef remove_const<Value>::type value_type;
    typedef Reference reference;
    typedef Value* pointer;
    typedef Difference difference_type;
    typedef /* see below */ iterator_category;

    reference operator*() const;
    /* see below */ operator->() const;
    /* see below */ operator[](difference_type n) const;
    Derived& operator++();
    Derived operator++(int);
    Derived& operator--();
    Derived operator--(int);
    Derived& operator+=(difference_type n);
    Derived& operator-=(difference_type n);
    Derived operator-(difference_type n) const;
 protected:
    typedef iterator_facade iterator_facade_;
};

// Comparison operators
template <class Dr1, class V1, class TC1, class R1, class D1,
          class Dr2, class V2, class TC2, class R2, class D2>
typename enable_if_interoperable<Dr1,Dr2,bool>::type // exposition
operator ==(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);

template <class Dr1, class V1, class TC1, class R1, class D1,
          class Dr2, class V2, class TC2, class R2, class D2>
typename enable_if_interoperable<Dr1,Dr2,bool>::type
operator !=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);

template <class Dr1, class V1, class TC1, class R1, class D1,
          class Dr2, class V2, class TC2, class R2, class D2>
typename enable_if_interoperable<Dr1,Dr2,bool>::type
operator <(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);

template <class Dr1, class V1, class TC1, class R1, class D1,
          class Dr2, class V2, class TC2, class R2, class D2>
typename enable_if_interoperable<Dr1,Dr2,bool>::type
operator <=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);

template <class Dr1, class V1, class TC1, class R1, class D1,
          class Dr2, class V2, class TC2, class R2, class D2>
typename enable_if_interoperable<Dr1,Dr2,bool>::type
operator >(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);

template <class Dr1, class V1, class TC1, class R1, class D1,
          class Dr2, class V2, class TC2, class R2, class D2>
typename enable_if_interoperable<Dr1,Dr2,bool>::type
operator >=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);

// Iterator difference
template <class Dr1, class V1, class TC1, class R1, class D1,
          class Dr2, class V2, class TC2, class R2, class D2>
/* see below */
operator-(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
          iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);

// Iterator addition
template <class Dr, class V, class TC, class R, class D>
Derived operator+ (iterator_facade<Dr,V,TC,R,D> const&,
                   typename Derived::difference_type n);

template <class Dr, class V, class TC, class R, class D>
Derived operator+ (typename Derived::difference_type n,
                   iterator_facade<Dr,V,TC,R,D> const&);

iterator_category成员iterator_facade

iterator-category(CategoryOrTraversal, value_type, reference)

其中 *iterator-category* 定义如下:

iterator-category(C,R,V) :=
   if (C is convertible to std::input_iterator_tag
       || C is convertible to std::output_iterator_tag
   )
       return C

   else if (C is not convertible to incrementable_traversal_tag)
       the program is ill-formed

   else return a type X satisfying the following two constraints:

      1. X is convertible to X1, and not to any more-derived
         type, where X1 is defined by:

           if (R is a reference type
               && C is convertible to forward_traversal_tag)
           {
               if (C is convertible to random_access_traversal_tag)
                   X1 = random_access_iterator_tag
               else if (C is convertible to bidirectional_traversal_tag)
                   X1 = bidirectional_iterator_tag
               else
                   X1 = forward_iterator_tag
           }
           else
           {
               if (C is convertible to single_pass_traversal_tag
                   && R is convertible to V)
                   X1 = input_iterator_tag
               else
                   X1 = C
           }

      2. category-to-traversal(X) is convertible to the most
         derived traversal tag type to which X is also
         convertible, and not to any more-derived traversal tag
         type.

[注意:意图是允许iterator_category是五个原始类别标签之一,当转换为其中一个遍历标签的转换性不添加信息时]

enable_if_interoperable上面使用的模板仅用于说明目的。成员运算符应仅在重载集中提供,前提是派生类型Dr1andDr2是可互操作的,这意味着至少一种类型可转换为另一种类型。该enable_if_interoperable方法使用 SFINAE 在类型不可互操作时将运算符从重载集中移除。运算符应表现得*好像*enable_if_interoperable被定义为

template <bool, typename> enable_if_interoperable_impl
{};

template <typename T> enable_if_interoperable_impl<true,T>
{ typedef T type; };

template<typename Dr1, typename Dr2, typename T>
struct enable_if_interoperable
  : enable_if_interoperable_impl<
        is_convertible<Dr1,Dr2>::value || is_convertible<Dr2,Dr1>::value
      , T
    >
{};

iterator_facade要求

以下表格描述了在iterator_facadeDerived参数上典型的有效表达式,具体取决于它将模拟的迭代器概念。第一列中的操作必须可以通过类成员函数访问iterator_core_access。此外,static_cast<Derived*>(iterator_facade*)应该能够良好地构成。

在下表中,Fiterator_facade<X,V,C,R,D>, a是一个对象,类型为X, bandc是类型为const X, n是一个对象,其类型为F::difference_type, y是一个单次遍历迭代器类型的常量对象,它与Xz可互操作。是一个随机访问遍历迭代器类型的常量对象,它与X.

iterator_facade可互操作。核心操作

表达式 返回类型 断言/注意 用于实现迭代器概念(s)
c.dereference() F::reference   可读迭代器,可写迭代器
c.equal(y) 可转换为 bool 当且仅当candy指向相同位置。 单次遍历迭代器
a.increment() 未使用   可增量迭代器
a.decrement() 未使用   双向遍历迭代器
a.advance(n) 未使用   随机访问遍历迭代器
c.distance_to(z) 可转换为F::difference_type 等同于distance(c, X(z)). 随机访问遍历迭代器

iterator_facade操作

此部分中的操作根据Derived的核心接口上的操作进行描述,这些操作可能不可访问(即 private)。实现应通过类成员函数访问这些操作iterator_core_access.

reference operator*() const;

返回static_cast<Derived const*>(this)->dereference()

operator->() const;(参见 下方

返回

如果reference是引用类型,类型为pointer等于

&static_cast<Derived const*>(this)->dereference()

否则返回一个类型未指定的对象,使得(*static_cast<Derived const*>(this))->m等效于(w = **static_cast<Derived const*>(this), w.m)对于某个临时对象w类型为value_type.

未指定 operator[](difference_type n) const;

返回一个可转换为value_type的对象。对于常量对象v类型为value_typen类型为difference_type, (*this)[n] = v等效于*(*this + n) = vstatic_cast<value_type const&>((*this)[n])等效于static_cast<value_type const&>(*(*this + n))

Derived& operator++();

效果
static_cast<Derived*>(this)->increment();
return *static_cast<Derived*>(this);

Derived operator++(int);

效果
Derived tmp(static_cast<Derived const*>(this));
++*this;
return tmp;

Derived& operator--();

效果
static_cast<Derived*>(this)->decrement();
return *static_cast<Derived*>(this);

Derived operator--(int);

效果
Derived tmp(static_cast<Derived const*>(this));
--*this;
return tmp;

Derived& operator+=(difference_type n);

效果
static_cast<Derived*>(this)->advance(n);
return *static_cast<Derived*>(this);

Derived& operator-=(difference_type n);

效果
static_cast<Derived*>(this)->advance(-n);
return *static_cast<Derived*>(this);

Derived operator-(difference_type n) const;

效果
Derived tmp(static_cast<Derived const*>(this));
return tmp -= n;
template <class Dr, class V, class TC, class R, class D>
Derived operator+ (iterator_facade<Dr,V,TC,R,D> const&,
                   typename Derived::difference_type n);

template <class Dr, class V, class TC, class R, class D>
Derived operator+ (typename Derived::difference_type n,
                   iterator_facade<Dr,V,TC,R,D> const&);
效果
Derived tmp(static_cast<Derived const*>(this));
return tmp += n;
template <class Dr1, class V1, class TC1, class R1, class D1,
          class Dr2, class V2, class TC2, class R2, class D2>
typename enable_if_interoperable<Dr1,Dr2,bool>::type
operator ==(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
返回

ifis_convertible<Dr2,Dr1>::value

((Dr1 const&)lhs).equal((Dr2 const&)rhs).

否则,

((Dr2 const&)rhs).equal((Dr1 const&)lhs).

template <class Dr1, class V1, class TC1, class R1, class D1,
          class Dr2, class V2, class TC2, class R2, class D2>
typename enable_if_interoperable<Dr1,Dr2,bool>::type
operator !=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
返回

ifis_convertible<Dr2,Dr1>::value

!((Dr1 const&)lhs).equal((Dr2 const&)rhs).

否则,

!((Dr2 const&)rhs).equal((Dr1 const&)lhs).

template <class Dr1, class V1, class TC1, class R1, class D1,
          class Dr2, class V2, class TC2, class R2, class D2>
typename enable_if_interoperable<Dr1,Dr2,bool>::type
operator <(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
返回

ifis_convertible<Dr2,Dr1>::value

((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) < 0.

否则,

((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) > 0.

template <class Dr1, class V1, class TC1, class R1, class D1,
          class Dr2, class V2, class TC2, class R2, class D2>
typename enable_if_interoperable<Dr1,Dr2,bool>::type
operator <=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
返回

ifis_convertible<Dr2,Dr1>::value

((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) <= 0.

否则,

((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) >= 0.

template <class Dr1, class V1, class TC1, class R1, class D1,
          class Dr2, class V2, class TC2, class R2, class D2>
typename enable_if_interoperable<Dr1,Dr2,bool>::type
operator >(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
返回

ifis_convertible<Dr2,Dr1>::value

((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) > 0.

否则,

((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) < 0.

template <class Dr1, class V1, class TC1, class R1, class D1,
          class Dr2, class V2, class TC2, class R2, class D2>
typename enable_if_interoperable<Dr1,Dr2,bool>::type
operator >=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
返回

ifis_convertible<Dr2,Dr1>::value

((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) >= 0.

否则,

((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) <= 0.

template <class Dr1, class V1, class TC1, class R1, class D1,
          class Dr2, class V2, class TC2, class R2, class D2>
typename enable_if_interoperable<Dr1,Dr2,difference>::type
operator -(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
返回类型

ifis_convertible<Dr2,Dr1>::value

difference应为iterator_traits<Dr1>::difference_type.

否则

difference应为iterator_traits<Dr2>::difference_type

返回

ifis_convertible<Dr2,Dr1>::value

-((Dr1 const&)lhs).distance_to((Dr2 const&)rhs).

否则,

((Dr2 const&)rhs).distance_to((Dr1 const&)lhs).

迭代器适配器 [lib.iterator.adaptor]

Each specialization of theiterator_adaptorclass template is derived from a specialization ofiterator_facade. The core interface functions expected byiterator_facadeare implemented in terms of theiterator_adaptorBasetemplate parameter. A class derived fromiterator_adaptortypically redefines some of the core interface functions to adapt the behavior of theBasetype. Whether the derived class models any of the standard iterator concepts depends on the operations supported by theBasetype and which core interface functions ofiterator_facadeare redefined in theDerivedclass.

类模板iterator_adaptor

template <
    class Derived
  , class Base
  , class Value               = use_default
  , class CategoryOrTraversal = use_default
  , class Reference           = use_default
  , class Difference = use_default
>
class iterator_adaptor
  : public iterator_facade<Derived, V', C', R', D'> // see details
{
    friend class iterator_core_access;
 public:
    iterator_adaptor();
    explicit iterator_adaptor(Base const& iter);
    typedef Base base_type;
    Base const& base() const;
 protected:
    typedef iterator_adaptor iterator_adaptor_;
    Base const& base_reference() const;
    Base& base_reference();
 private: // Core iterator interface for iterator_facade.
    typename iterator_adaptor::reference dereference() const;

    template <
    class OtherDerived, class OtherIterator, class V, class C, class R, class D
    >
    bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;

    void advance(typename iterator_adaptor::difference_type n);
    void increment();
    void decrement();

    template <
        class OtherDerived, class OtherIterator, class V, class C, class R, class D
    >
    typename iterator_adaptor::difference_type distance_to(
        iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;

 private:
    Base m_iterator; // exposition only
};

iterator_adaptorrequirements

static_cast<Derived*>(iterator_adaptor*)shall be well-formed. TheBaseargument shall be Assignable and Copy Constructible.

iterator_adaptor基类参数

The V', C', R', and D' parameters of theiterator_facadeused as a base class in the summary ofiterator_adaptorabove are defined as follows

V' = if (Value is use_default)
          return iterator_traits<Base>::value_type
      else
          return Value

C' = if (CategoryOrTraversal is use_default)
          return iterator_traversal<Base>::type
      else
          return CategoryOrTraversal

R' = if (Reference is use_default)
          if (Value is use_default)
              return iterator_traits<Base>::reference
          else
              return Value&
      else
          return Reference

D' = if (Difference is use_default)
          return iterator_traits<Base>::difference_type
      else
          return Difference

iterator_adaptor公共操作

iterator_adaptor();

要求Basetype must be Default Constructible.
返回的一个实例iterator_adaptor带有m_iterator默认构造。

explicit iterator_adaptor(Base const& iter);

返回的一个实例iterator_adaptor带有m_iterator从...复制构造iter.

Base const& base() const;

返回m_iterator

iterator_adaptor受保护的成员函数

Base const& base_reference() const;

返回A const reference tom_iterator.

Base& base_reference();

返回A non-const reference tom_iterator.

iterator_adaptor私有成员函数

typename iterator_adaptor::reference dereference() const;

返回*m_iterator
template <
class OtherDerived, class OtherIterator, class V, class C, class R, class D
>
bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
返回m_iterator == x.base()

void advance(typename iterator_adaptor::difference_type n);

效果m_iterator += n;

void increment();

效果++m_iterator;

void decrement();

效果--m_iterator;
template <
    class OtherDerived, class OtherIterator, class V, class C, class R, class D
>
typename iterator_adaptor::difference_type distance_to(
    iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
返回y.base() - m_iterator

专用适配器 [lib.iterator.special.adaptors]

enable_if_convertible<X,Y>::type本节中使用的表达式仅用于说明目的。专用适配器的转换构造函数仅当类型为X的对象可隐式转换为类型为Y的对象时,才应存在于重载集中。涉及enable_if_convertible的签名应“如同”行为。enable_if_convertible被定义为

template <bool> enable_if_convertible_impl
{};

template <> enable_if_convertible_impl<true>
{ struct type; };

template<typename From, typename To>
struct enable_if_convertible
  : enable_if_convertible_impl<is_convertible<From,To>::value>
{};

如果使用默认参数以外的表达式来提供函数参数的值,且该参数的类型是根据enable_if_convertible编写的,则程序格式错误,无需诊断。

[注:enable_if_convertible方法使用 SFINAE 在类型不可隐式转换时将构造函数从重载集中移除。]

间接迭代器

indirect_iterator适配器通过在operator*()内部应用 *额外* 的解引用来适配迭代器。例如,此迭代器适配器使得可以像容器类型(例如list<foo*>)一样查看指针容器(例如list<foo>). indirect_iterator),就好像它是一个容器一样。pointeeandindirect_reference依赖于两个辅助 trait:value_type来为底层迭代器的

类模板pointee

template <class Dereferenceable>
struct pointee
{
    typedef /* see below */ type;
};
要求对于一个对象x类型为可解引, *x是良构的(well-formed)。如果++x是病构的(ill-formed),它既不应该是模棱两可的,也不应该违反访问控制,并且Dereferenceable::element_type应该是一个可访问的类型。否则iterator_traits<Dereferenceable>::value_type应该是良构的。[注意:这些要求不必适用于的显式或部分特化。pointee]

type根据以下算法确定,其中x是一个对象,类型为可解引:

if ( ++x is ill-formed )
{
    return ``Dereferenceable::element_type``
}
else if (``*x`` is a mutable reference to
         std::iterator_traits<Dereferenceable>::value_type)
{
    return iterator_traits<Dereferenceable>::value_type
}
else
{
    return iterator_traits<Dereferenceable>::value_type const
}

类模板indirect_reference

template <class Dereferenceable>
struct indirect_reference
{
    typedef /* see below */ type;
};
要求对于一个对象x类型为可解引, *x是良构的(well-formed)。如果++x是病构的(ill-formed),它既不应该是模棱两可的,也不应该违反访问控制,并且pointee<Dereferenceable>::type&应该是良构的。否则iterator_traits<Dereferenceable>::reference应该是良构的。[注意:这些要求不必适用于的显式或部分特化。indirect_reference]

type根据以下算法确定,其中x是一个对象,类型为可解引:

if ( ++x is ill-formed )
    return ``pointee<Dereferenceable>::type&``
else
    std::iterator_traits<Dereferenceable>::reference

类模板indirect_iterator

template <
    class Iterator
  , class Value = use_default
  , class CategoryOrTraversal = use_default
  , class Reference = use_default
  , class Difference = use_default
>
class indirect_iterator
{
 public:
    typedef /* see below */ value_type;
    typedef /* see below */ reference;
    typedef /* see below */ pointer;
    typedef /* see below */ difference_type;
    typedef /* see below */ iterator_category;

    indirect_iterator();
    indirect_iterator(Iterator x);

    template <
        class Iterator2, class Value2, class Category2
      , class Reference2, class Difference2
    >
    indirect_iterator(
        indirect_iterator<
             Iterator2, Value2, Category2, Reference2, Difference2
        > const& y
      , typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
    );

    Iterator const& base() const;
    reference operator*() const;
    indirect_iterator& operator++();
    indirect_iterator& operator--();
private:
   Iterator m_iterator; // exposition
};

不是迭代器提供支持。indirect_iterator的成员类型按照以下伪代码定义,其中Viterator_traits<Iterator>::value_type

if (Value is use_default) then
    typedef remove_const<pointee<V>::type>::type value_type;
else
    typedef remove_const<Value>::type value_type;

if (Reference is use_default) then
    if (Value is use_default) then
        typedef indirect_reference<V>::type reference;
    else
        typedef Value& reference;
else
    typedef Reference reference;

if (Value is use_default) then
    typedef pointee<V>::type* pointer;
else
    typedef Value* pointer;

if (Difference is use_default)
    typedef iterator_traits<Iterator>::difference_type difference_type;
else
    typedef Difference difference_type;

if (CategoryOrTraversal is use_default)
    typedef iterator-category (
        iterator_traversal<Iterator>::type,``reference``,``value_type``
    ) iterator_category;
else
    typedef iterator-category (
        CategoryOrTraversal,``reference``,``value_type``
    ) iterator_category;

indirect_iteratorrequirements

表达式*v,其中v是一个对象,其类型为iterator_traits<Iterator>::value_type应为有效表达式且可转换为reference. Iterator应模拟由iterator_category. , 参考差值指示的遍历概念。应选择value_type, referencedifference_type使得iterator_category.

满足由iterator_traits<Iterator>::value_type指示的要求。[注意:如果参数不是use_default,则value_type成员的默认值推导算法暗示了进一步的要求。]

indirect_iterator模型

除了由iterator_categoryiterator_traversal<indirect_iterator>::type指示的概念外,indirect_iterator的特化模拟了以下概念,其中v是一个对象,其类型为iterator_traits<Iterator>::value_type:

  • 可读迭代器,如果reference(*v)可转换为value_type.
  • 可写迭代器,如果reference(*v) = t是有效表达式(其中t是一个对象,类型为indirect_iterator::value_type)
  • 左值迭代器,如果reference是引用类型。

indirect_iterator<X,V1,C1,R1,D1>indirect_iterator<Y,V2,C2,R2,D2>当且仅当XY.

indirect_iterator操作

除了上面描述的概念所需的操作外,indirect_iterator的特化还提供了以下操作。

indirect_iterator();

要求Iterator必须是默认可构造的。
效果构造一个实例indirect_iterator使用默认构造的m_iterator.

indirect_iterator(Iterator x);

效果构造一个实例indirect_iterator带有m_iterator从...复制构造x.
template <
    class Iterator2, class Value2, unsigned Access, class Traversal
  , class Reference2, class Difference2
>
indirect_iterator(
    indirect_iterator<
         Iterator2, Value2, Access, Traversal, Reference2, Difference2
    > const& y
  , typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
);
要求Iterator2隐式转换为Iterator.
效果构造一个实例indirect_iteratorm_iterator子对象由...构造y.base().

Iterator const& base() const;

返回m_iterator

reference operator*() const;

返回**m_iterator

indirect_iterator& operator++();

效果++m_iterator
返回*this

indirect_iterator& operator--();

效果--m_iterator
返回*this

反向迭代器

反向迭代器适配器以相反的方向遍历适配的迭代器范围。

类模板reverse_iterator

template <class Iterator>
class reverse_iterator
{
public:
  typedef iterator_traits<Iterator>::value_type value_type;
  typedef iterator_traits<Iterator>::reference reference;
  typedef iterator_traits<Iterator>::pointer pointer;
  typedef iterator_traits<Iterator>::difference_type difference_type;
  typedef /* see below */ iterator_category;

  reverse_iterator() {}
  explicit reverse_iterator(Iterator x) ;

  template<class OtherIterator>
  reverse_iterator(
      reverse_iterator<OtherIterator> const& r
    , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
  );
  Iterator const& base() const;
  reference operator*() const;
  reverse_iterator& operator++();
  reverse_iterator& operator--();
private:
  Iterator m_iterator; // exposition
};

如果Iterator模拟随机访问遍历迭代器和可读左值迭代器,然后iterator_category可转换为random_access_iterator_tag。否则,如果Iterator模拟双向遍历迭代器和可读左值迭代器,则iterator_category可转换为bidirectional_iterator_tag。否则,iterator_category可转换为input_iterator_tag.

reverse_iteratorrequirements

Iterator必须是双向遍历迭代器的模型。类型iterator_traits<Iterator>::reference必须是*i,其中i是一个对象,类型为Iterator.

reverse_iterator模型

一个特化reverse_iterator模拟与其Iterator参数相同的迭代器遍历和迭代器访问概念。此外,它可能模拟下表中指定的旧迭代器概念

如果I模型 reverse_iterator<I>模型
可读左值迭代器(Readable Lvalue Iterator)、双向遍历迭代器(Bidirectional Traversal Iterator) 双向迭代器(Bidirectional Iterator)
可写左值迭代器(Writable Lvalue Iterator)、双向遍历迭代器(Bidirectional Traversal Iterator) 可变双向迭代器(Mutable Bidirectional Iterator)
可读左值迭代器(Readable Lvalue Iterator)、随机访问遍历迭代器(Random Access Traversal Iterator) 随机访问迭代器
可写左值迭代器(Writable Lvalue Iterator)、随机访问遍历迭代器(Random Access Traversal Iterator) 可变随机访问迭代器(Mutable Random Access Iterator)

reverse_iterator<X>reverse_iterator<Y>当且仅当XY.

reverse_iterator操作

除了参数所模拟的概念所要求的操作之外,reverse_iterator, reverse_iterator还提供了以下操作。

reverse_iterator();

要求Iterator必须是默认可构造的。
效果构造一个实例reverse_iterator带有m_iterator默认构造。

explicit reverse_iterator(Iterator x);

效果构造一个实例reverse_iterator带有m_iterator从...复制构造x.
template<class OtherIterator>
reverse_iterator(
    reverse_iterator<OtherIterator> const& r
  , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
);
要求OtherIterator隐式转换为Iterator.
效果构造实例reverse_iteratorm_iterator子对象由...构造y.base().

Iterator const& base() const;

返回m_iterator

reference operator*() const;

效果
Iterator tmp = m_iterator;
return *--tmp;

reverse_iterator& operator++();

效果--m_iterator
返回*this

reverse_iterator& operator--();

效果++m_iterator
返回*this

变换迭代器

transform 迭代器通过修改operator*对迭代器解引用结果应用函数对象并返回结果。

类模板transform_iterator

template <class UnaryFunction,
          class Iterator,
          class Reference = use_default,
          class Value = use_default>
class transform_iterator
{
public:
  typedef /* see below */ value_type;
  typedef /* see below */ reference;
  typedef /* see below */ pointer;
  typedef iterator_traits<Iterator>::difference_type difference_type;
  typedef /* see below */ iterator_category;

  transform_iterator();
  transform_iterator(Iterator const& x, UnaryFunction f);

  template<class F2, class I2, class R2, class V2>
  transform_iterator(
        transform_iterator<F2, I2, R2, V2> const& t
      , typename enable_if_convertible<I2, Iterator>::type* = 0      // exposition only
      , typename enable_if_convertible<F2, UnaryFunction>::type* = 0 // exposition only
  );
  UnaryFunction functor() const;
  Iterator const& base() const;
  reference operator*() const;
  transform_iterator& operator++();
  transform_iterator& operator--();
private:
  Iterator m_iterator; // exposition only
  UnaryFunction m_f;   // exposition only
};

如果参考use_default然后reference成员transform_iteratorresult_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type。否则,reference参考.

如果use_default然后value_type成员是remove_cv<remove_reference<reference> >::type。否则,value_type.

如果Iterator模型 Readable Lvalue Iterator,并且如果Iterator模型 Random Access Traversal Iterator,则iterator_category可转换为random_access_iterator_tag。否则,如果Iterator模型 Bidirectional Traversal Iterator,则iterator_category可转换为bidirectional_iterator_tag否则iterator_category可转换为forward_iterator_tag。如果Iterator不模型 Readable Lvalue Iterator,则iterator_category可转换为input_iterator_tag.

transform_iteratorrequirements

类型UnaryFunction必须是 Assignable、Copy Constructible,并且表达式f(*i)必须是有效的,其中f是一个对象,类型为UnaryFunction, i是一个对象,类型为Iterator的 const 对象,其中f(*i)的类型必须是result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type.

参数Iterator都必须是 Readable Iterator。

transform_iterator模型

生成的transform_iterator模型以下概念中最精炼的、同时也被模型为Iterator.

  • Writable Lvalue Iterator,如果transform_iterator::reference是一个非 const 引用。
  • Readable Lvalue Iterator,如果transform_iterator::reference是一个 const 引用。
  • 否则为可读迭代器(Readable Iterator)。

transform_iterator模型最精炼的标准遍历概念,同时也被Iterator参数。

如果transform_iterator是 Readable Lvalue Iterator 的模型,那么它根据Iterator参数模型,模型以下原始迭代器概念。

如果Iterator模型 transform_iterator模型
单次遍历迭代器 输入迭代器
前向遍历迭代器 前向迭代器
双向遍历迭代器 双向迭代器(Bidirectional Iterator)
随机访问遍历迭代器 随机访问迭代器

如果transform_iterator是 Writable Lvalue Iterator 的模型,那么它是一个可写迭代器(如旧迭代器要求中所定义)。

transform_iterator<F1, X, R1, V1>transform_iterator<F2, Y, R2, V2>当且仅当XY.

transform_iterator操作

除了参数所模拟的概念所要求的操作之外,transform_iterator, transform_iterator还提供了以下操作。

transform_iterator();

返回的一个实例transform_iterator带有m_fandm_iterator默认构造。

transform_iterator(Iterator const& x, UnaryFunction f);

返回的一个实例transform_iterator带有m_f初始化为fandm_iterator初始化为x.
template<class F2, class I2, class R2, class V2>
transform_iterator(
      transform_iterator<F2, I2, R2, V2> const& t
    , typename enable_if_convertible<I2, Iterator>::type* = 0      // exposition only
    , typename enable_if_convertible<F2, UnaryFunction>::type* = 0 // exposition only
);
返回的一个实例transform_iterator带有m_f初始化为t.functor()andm_iterator初始化为t.base().
要求OtherIterator隐式转换为Iterator.

UnaryFunction functor() const;

返回m_f

Iterator const& base() const;

返回m_iterator

reference operator*() const;

返回m_f(*m_iterator)

transform_iterator& operator++();

效果++m_iterator
返回*this

transform_iterator& operator--();

效果--m_iterator
返回*this

过滤迭代器

filter 迭代器适配器创建了一个迭代器范围的视图,其中某些范围内的元素将被跳过。一个谓词函数对象控制哪些元素被跳过。当谓词应用于一个元素时,如果它返回true则该元素被保留,如果它返回false那么元素就会被跳过。在跳过元素时,过滤适配器需要知道何时停止,以避免超出底层范围的末尾。因此,过滤迭代器是使用一对迭代器构造的,这对迭代器指示未过滤序列中要遍历的元素范围。

类模板filter_iterator

template <class Predicate, class Iterator>
class filter_iterator
{
 public:
    typedef iterator_traits<Iterator>::value_type value_type;
    typedef iterator_traits<Iterator>::reference reference;
    typedef iterator_traits<Iterator>::pointer pointer;
    typedef iterator_traits<Iterator>::difference_type difference_type;
    typedef /* see below */ iterator_category;

    filter_iterator();
    filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());
    filter_iterator(Iterator x, Iterator end = Iterator());
    template<class OtherIterator>
    filter_iterator(
        filter_iterator<Predicate, OtherIterator> const& t
        , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
        );
    Predicate predicate() const;
    Iterator end() const;
    Iterator const& base() const;
    reference operator*() const;
    filter_iterator& operator++();
private:
    Predicate m_pred; // exposition only
    Iterator m_iter;  // exposition only
    Iterator m_end;   // exposition only
};

如果Iterator模型 Readable Lvalue Iterator 和 Bidirectional Traversal Iterator,然后iterator_category可转换为std::bidirectional_iterator_tag。否则,如果Iterator模型 Readable Lvalue Iterator 和 Forward Traversal Iterator,然后iterator_category可转换为std::forward_iterator_tag否则iterator_category可转换为std::input_iterator_tag.

filter_iteratorrequirements

Iterator参数必须满足 Readable Iterator 和 Single Pass Iterator 的要求,或者满足 Input Iterator 的要求。

谓词参数必须是 Assignable、Copy Constructible,并且表达式p(x)必须是有效的,其中p是一个对象,类型为谓词, x是一个对象,类型为iterator_traits<Iterator>::value_type的 const 对象,其中p(x)必须可转换为bool.

filter_iterator模型

模型filter_iterator的模型取决于Iterator参数模型,具体如下表所示。

如果Iterator模型 filter_iterator模型
单次遍历迭代器 单次遍历迭代器
前向遍历迭代器 前向遍历迭代器
双向遍历迭代器 双向遍历迭代器
如果Iterator模型 filter_iterator模型
可读迭代器 可读迭代器
可写迭代器 可写迭代器
左值迭代器 左值迭代器
如果Iterator模型 filter_iterator模型
Readable Iterator, Single Pass Iterator 输入迭代器
Readable Lvalue Iterator, Forward Traversal Iterator 前向迭代器
Writable Lvalue Iterator, Forward Traversal Iterator Mutable Forward Iterator
Writable Lvalue Iterator, Bidirectional Iterator 可变双向迭代器(Mutable Bidirectional Iterator)

filter_iterator<P1, X>filter_iterator<P2, Y>当且仅当XY.

filter_iterator操作

除了概念所要求的那些操作外,filter_iterator满足,filter_iterator还提供了以下操作。

filter_iterator();

要求谓词andIterator必须是默认可构造的。
效果构造一个filter_iterator其``m_pred``、m_iterm_end成员是默认构造的。

filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());

效果构造一个filter_iterator其中m_iter是在范围[x,end)使得f(*m_iter) == true或``m_iter == end`` 的第一个位置。成员m_pred是从fandm_endtemplate< class PtrSequence > void transfer( iterator before, typename PtrSequence::iterator object, PtrSequence& from );end.

filter_iterator(Iterator x, Iterator end = Iterator());

要求谓词必须是 Default Constructible 并且谓词是一个类类型(不是函数指针)。
效果构造一个filter_iterator其中m_iter是在范围[x,end)使得m_pred(*m_iter) == true或``m_iter == end`` 的第一个位置。成员m_pred是默认构造的。
template <class OtherIterator>
filter_iterator(
    filter_iterator<Predicate, OtherIterator> const& t
    , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
    );``
要求OtherIterator隐式转换为Iterator.
效果构造一个 filter 迭代器,其成员是从复制的t.

Predicate predicate() const;

返回m_pred

Iterator end() const;

返回m_end

Iterator const& base() const;

返回m_iterator

reference operator*() const;

返回*m_iter

filter_iterator& operator++();

效果增加m_iter然后继续增加m_iter直到m_iter == m_endm_pred(*m_iter) == true.
返回*this

计数迭代器

counting_iterator通过添加一个operator*来适配一个对象,该对象返回对象的当前值。所有其他迭代器操作都转发给被适配的对象。

类模板counting_iterator

template <
    class Incrementable
  , class CategoryOrTraversal = use_default
  , class Difference = use_default
>
class counting_iterator
{
public:
    typedef Incrementable value_type;
    typedef const Incrementable& reference;
    typedef const Incrementable* pointer;
    typedef /* see below */ difference_type;
    typedef /* see below */ iterator_category;

    counting_iterator();
    counting_iterator(counting_iterator const& rhs);
    explicit counting_iterator(Incrementable x);
    Incrementable const& base() const;
    reference operator*() const;
    counting_iterator& operator++();
    counting_iterator& operator--();
private:
    Incrementable m_inc; // exposition
};

如果差值参数是use_defaultdifference_type是一个未指定的带符号整型类型。否则difference_type差值.

iterator_category是根据以下算法确定的

if (CategoryOrTraversal is not use_default)
    return CategoryOrTraversal
else if (numeric_limits<Incrementable>::is_specialized)
    return iterator-category(
        random_access_traversal_tag, Incrementable, const Incrementable&)
else
    return iterator-category(
         iterator_traversal<Incrementable>::type,
         Incrementable, const Incrementable&)
[注意:鼓励实现者提供
operator-difference_type的实现,并在std::numeric_limits<Incrementable>::is_specialized为 true 的情况下避免溢出。]

counting_iteratorrequirements

Incrementable参数应该是 Copy Constructible 和 Assignable 的。

如果iterator_category可转换为forward_iterator_tagforward_traversal_tag,则以下语句必须是 well-formed 的

Incrementable i, j;
++i;         // pre-increment
i == j;      // operator equal

如果iterator_category可转换为bidirectional_iterator_tagbidirectional_traversal_tag,则以下表达式必须也是 well-formed 的

--i

如果iterator_category可转换为random_access_iterator_tagrandom_access_traversal_tag,则以下语句必须也是有效的

counting_iterator::difference_type n;
i += n;
n = i - j;
i < j;

counting_iterator模型

的特化counting_iterator模型 Readable Lvalue Iterator。此外,它们还模型与其iterator_category可转换的迭代器标签相对应的概念。另外,如果CategoryOrTraversal不是use_defaultcounting_iterator模型与迭代器标签相对应的概念CategoryOrTraversal。否则,如果numeric_limits<Incrementable>::is_specialized,那么counting_iterator模型 Random Access Traversal Iterator。否则,counting_iterator模型与Incrementable.

counting_iterator<X,C1,D1>counting_iterator<Y,C2,D2>当且仅当XY.

counting_iterator操作

除了参数所模拟的概念所要求的操作之外,counting_iterator, counting_iterator还提供了以下操作。

counting_iterator();

要求Incrementable是 Default Constructible 的。
效果默认构造成员m_inc.

counting_iterator(counting_iterator const& rhs);

效果构造成员m_inctemplate< class PtrSequence > void transfer( iterator before, typename PtrSequence::iterator object, PtrSequence& from );rhs.m_inc.

explicit counting_iterator(Incrementable x);

效果构造成员m_inctemplate< class PtrSequence > void transfer( iterator before, typename PtrSequence::iterator object, PtrSequence& from );x.

reference operator*() const;

返回m_inc

counting_iterator& operator++();

效果++m_inc
返回*this

counting_iterator& operator--();

效果--m_inc
返回*this

Incrementable const& base() const;

返回m_inc

函数输出迭代器

函数输出迭代器适配器使得创建自定义输出迭代器更加容易。该适配器接受一个一元函数并创建一个输出迭代器模型。分配给输出迭代器的每个项目都作为参数传递给一元函数。此迭代器的动机是,创建符合标准的输出迭代器并非易事,特别是因为正确的实现通常需要一个代理对象。

function_output_iteratorrequirements

UnaryFunction必须是 Assignable 和 Copy Constructible。

function_output_iterator模型

function_output_iterator是 Writable 和 Incrementable Iterator 概念的模型。

function_output_iterator操作

explicit function_output_iterator(const UnaryFunction& f = UnaryFunction());

效果构造一个实例function_output_iterator带有m_f由...构造f.

operator*();

返回一个对象r类型未指定,使得r = t等效于m_f(t)对于所有t.

function_output_iterator& operator++();

返回*this

function_output_iterator& operator++(int);

返回*this