reverse_iterator_ref.rst 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. .. Copyright David Abrahams 2006. Distributed under the Boost
  2. .. Software License, Version 1.0. (See accompanying
  3. .. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  4. ::
  5. template <class Iterator>
  6. class reverse_iterator
  7. {
  8. public:
  9. typedef iterator_traits<Iterator>::value_type value_type;
  10. typedef iterator_traits<Iterator>::reference reference;
  11. typedef iterator_traits<Iterator>::pointer pointer;
  12. typedef iterator_traits<Iterator>::difference_type difference_type;
  13. typedef /* see below */ iterator_category;
  14. reverse_iterator() {}
  15. explicit reverse_iterator(Iterator x) ;
  16. template<class OtherIterator>
  17. reverse_iterator(
  18. reverse_iterator<OtherIterator> const& r
  19. , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
  20. );
  21. Iterator const& base() const;
  22. reference operator*() const;
  23. reverse_iterator& operator++();
  24. reverse_iterator& operator--();
  25. private:
  26. Iterator m_iterator; // exposition
  27. };
  28. If ``Iterator`` models Random Access Traversal Iterator and Readable
  29. Lvalue Iterator, then ``iterator_category`` is convertible to
  30. ``random_access_iterator_tag``. Otherwise, if
  31. ``Iterator`` models Bidirectional Traversal Iterator and Readable
  32. Lvalue Iterator, then ``iterator_category`` is convertible to
  33. ``bidirectional_iterator_tag``. Otherwise, ``iterator_category`` is
  34. convertible to ``input_iterator_tag``.
  35. ``reverse_iterator`` requirements
  36. .................................
  37. ``Iterator`` must be a model of Bidirectional Traversal Iterator. The
  38. type ``iterator_traits<Iterator>::reference`` must be the type of
  39. ``*i``, where ``i`` is an object of type ``Iterator``.
  40. ``reverse_iterator`` models
  41. ...........................
  42. A specialization of ``reverse_iterator`` models the same iterator
  43. traversal and iterator access concepts modeled by its ``Iterator``
  44. argument. In addition, it may model old iterator concepts
  45. specified in the following table:
  46. +---------------------------------------+-----------------------------------+
  47. | If ``I`` models |then ``reverse_iterator<I>`` models|
  48. +=======================================+===================================+
  49. | Readable Lvalue Iterator, | Bidirectional Iterator |
  50. | Bidirectional Traversal Iterator | |
  51. +---------------------------------------+-----------------------------------+
  52. | Writable Lvalue Iterator, | Mutable Bidirectional Iterator |
  53. | Bidirectional Traversal Iterator | |
  54. +---------------------------------------+-----------------------------------+
  55. | Readable Lvalue Iterator, | Random Access Iterator |
  56. | Random Access Traversal Iterator | |
  57. +---------------------------------------+-----------------------------------+
  58. | Writable Lvalue Iterator, | Mutable Random Access Iterator |
  59. | Random Access Traversal Iterator | |
  60. +---------------------------------------+-----------------------------------+
  61. ``reverse_iterator<X>`` is interoperable with
  62. ``reverse_iterator<Y>`` if and only if ``X`` is interoperable with
  63. ``Y``.
  64. ``reverse_iterator`` operations
  65. ...............................
  66. In addition to the operations required by the concepts modeled by
  67. ``reverse_iterator``, ``reverse_iterator`` provides the following
  68. operations.
  69. ``reverse_iterator();``
  70. :Requires: ``Iterator`` must be Default Constructible.
  71. :Effects: Constructs an instance of ``reverse_iterator`` with ``m_iterator``
  72. default constructed.
  73. ``explicit reverse_iterator(Iterator x);``
  74. :Effects: Constructs an instance of ``reverse_iterator`` with
  75. ``m_iterator`` copy constructed from ``x``.
  76. ::
  77. template<class OtherIterator>
  78. reverse_iterator(
  79. reverse_iterator<OtherIterator> const& r
  80. , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
  81. );
  82. :Requires: ``OtherIterator`` is implicitly convertible to ``Iterator``.
  83. :Effects: Constructs instance of ``reverse_iterator`` whose
  84. ``m_iterator`` subobject is constructed from ``y.base()``.
  85. ``Iterator const& base() const;``
  86. :Returns: ``m_iterator``
  87. ``reference operator*() const;``
  88. :Effects:
  89. ::
  90. Iterator tmp = m_iterator;
  91. return *--tmp;
  92. ``reverse_iterator& operator++();``
  93. :Effects: ``--m_iterator``
  94. :Returns: ``*this``
  95. ``reverse_iterator& operator--();``
  96. :Effects: ``++m_iterator``
  97. :Returns: ``*this``