.. parsed-literal:: template< class ElementIterator , class IndexIterator , class ValueT = use_default , class CategoryT = use_default , class ReferenceT = use_default , class DifferenceT = use_default > class permutation_iterator { public: permutation_iterator(); explicit permutation_iterator(ElementIterator x, IndexIterator y); template< class OEIter, class OIIter, class V, class C, class R, class D > permutation_iterator( permutation_iterator const& r , typename enable_if_convertible::type* = 0 , typename enable_if_convertible::type* = 0 ); reference operator*() const; permutation_iterator& operator++(); ElementIterator const& base() const; private: ElementIterator m_elt; // exposition only IndexIterator m_order; // exposition only }; template permutation_iterator make_permutation_iterator( ElementIterator e, IndexIterator i); ``permutation_iterator`` requirements ------------------------------------- ``ElementIterator`` shall model Random Access Traversal Iterator. ``IndexIterator`` shall model Readable Iterator. The value type of the ``IndexIterator`` must be convertible to the difference type of ``ElementIterator``. ``permutation_iterator`` models ------------------------------- ``permutation_iterator`` models the same iterator traversal concepts as ``IndexIterator`` and the same iterator access concepts as ``ElementIterator``. If ``IndexIterator`` models Single Pass Iterator and ``ElementIterator`` models Readable Iterator then ``permutation_iterator`` models Input Iterator. If ``IndexIterator`` models Forward Traversal Iterator and ``ElementIterator`` models Readable Lvalue Iterator then ``permutation_iterator`` models Forward Iterator. If ``IndexIterator`` models Bidirectional Traversal Iterator and ``ElementIterator`` models Readable Lvalue Iterator then ``permutation_iterator`` models Bidirectional Iterator. If ``IndexIterator`` models Random Access Traversal Iterator and ``ElementIterator`` models Readable Lvalue Iterator then ``permutation_iterator`` models Random Access Iterator. ``permutation_iterator`` is interoperable with ``permutation_iterator`` if and only if ``X`` is interoperable with ``Y`` and ``E1`` is convertible to ``E2``. ``permutation_iterator`` operations ----------------------------------- In addition to those operations required by the concepts that ``permutation_iterator`` models, ``permutation_iterator`` provides the following operations. ``permutation_iterator();`` :Effects: Default constructs ``m_elt`` and ``m_order``. ``explicit permutation_iterator(ElementIterator x, IndexIterator y);`` :Effects: Constructs ``m_elt`` from ``x`` and ``m_order`` from ``y``. :: template< class OEIter, class OIIter, class V, class C, class R, class D > permutation_iterator( permutation_iterator const& r , typename enable_if_convertible::type* = 0 , typename enable_if_convertible::type* = 0 ); :Effects: Constructs ``m_elt`` from ``r.m_elt`` and ``m_order`` from ``y.m_order``. ``reference operator*() const;`` :Returns: ``*(m_elt + *m_order)`` ``permutation_iterator& operator++();`` :Effects: ``++m_order`` :Returns: ``*this`` ``ElementIterator const& base() const;`` :Returns: ``m_order`` :: template permutation_iterator make_permutation_iterator(ElementIterator e, IndexIterator i); :Returns: ``permutation_iterator(e, i)``