reverse_iterator.qbk 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. [section:reverse Reverse Iterator]
  2. The reverse iterator adaptor iterates through the adapted iterator
  3. range in the opposite direction.
  4. [h2 Example]
  5. The following example prints an array of characters in reverse order
  6. using `reverse_iterator`.
  7. char letters_[] = "hello world!";
  8. const int N = sizeof(letters_)/sizeof(char) - 1;
  9. typedef char* base_iterator;
  10. base_iterator letters(letters_);
  11. std::cout << "original sequence of letters:\t\t\t" << letters_ << std::endl;
  12. boost::reverse_iterator<base_iterator>
  13. reverse_letters_first(letters + N),
  14. reverse_letters_last(letters);
  15. std::cout << "sequence in reverse order:\t\t\t";
  16. std::copy(reverse_letters_first, reverse_letters_last,
  17. std::ostream_iterator<char>(std::cout));
  18. std::cout << std::endl;
  19. std::cout << "sequence in double-reversed (normal) order:\t";
  20. std::copy(boost::make_reverse_iterator(reverse_letters_last),
  21. boost::make_reverse_iterator(reverse_letters_first),
  22. std::ostream_iterator<char>(std::cout));
  23. std::cout << std::endl;
  24. The output is:
  25. original sequence of letters: hello world!
  26. sequence in reverse order: !dlrow olleh
  27. sequence in double-reversed (normal) order: hello world!
  28. The source code for this example can be found
  29. [@../example/reverse_iterator_example.cpp here].
  30. [h2 Reference]
  31. [h3 Synopsis]
  32. template <class Iterator>
  33. class reverse_iterator
  34. {
  35. public:
  36. typedef iterator_traits<Iterator>::value_type value_type;
  37. typedef iterator_traits<Iterator>::reference reference;
  38. typedef iterator_traits<Iterator>::pointer pointer;
  39. typedef iterator_traits<Iterator>::difference_type difference_type;
  40. typedef /* see below */ iterator_category;
  41. reverse_iterator() {}
  42. explicit reverse_iterator(Iterator x) ;
  43. template<class OtherIterator>
  44. reverse_iterator(
  45. reverse_iterator<OtherIterator> const& r
  46. , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
  47. );
  48. Iterator const& base() const;
  49. reference operator*() const;
  50. reverse_iterator& operator++();
  51. reverse_iterator& operator--();
  52. private:
  53. Iterator m_iterator; // exposition
  54. };
  55. If `Iterator` models Random Access Traversal Iterator and Readable
  56. Lvalue Iterator, then `iterator_category` is convertible to
  57. `random_access_iterator_tag`. Otherwise, if
  58. `Iterator` models Bidirectional Traversal Iterator and Readable
  59. Lvalue Iterator, then `iterator_category` is convertible to
  60. `bidirectional_iterator_tag`. Otherwise, `iterator_category` is
  61. convertible to `input_iterator_tag`.
  62. [h3 Requirements]
  63. `Iterator` must be a model of Bidirectional Traversal Iterator. The
  64. type `iterator_traits<Iterator>::reference` must be the type of
  65. `*i`, where `i` is an object of type `Iterator`.
  66. [h3 Concepts]
  67. A specialization of `reverse_iterator` models the same iterator
  68. traversal and iterator access concepts modeled by its `Iterator`
  69. argument. In addition, it may model old iterator concepts
  70. specified in the following table:
  71. [table Categories
  72. [[If `I` models ][then `reverse_iterator<I>` models]]
  73. [[Readable Lvalue Iterator, Bidirectional Traversal Iterator][Bidirectional Iterator]]
  74. [[Writable Lvalue Iterator, Bidirectional Traversal Iterator][Mutable Bidirectional Iterator]]
  75. [[Readable Lvalue Iterator, Random Access Traversal Iterator][Random Access Iterator]]
  76. [[Writable Lvalue Iterator, Random Access Traversal Iterator][Mutable Random Access Iterator]]
  77. ]
  78. `reverse_iterator<X>` is interoperable with
  79. `reverse_iterator<Y>` if and only if `X` is interoperable with
  80. `Y`.
  81. [h3 Operations]
  82. In addition to the operations required by the concepts modeled by
  83. `reverse_iterator`, `reverse_iterator` provides the following
  84. operations.
  85. reverse_iterator();
  86. [*Requires: ] `Iterator` must be Default Constructible.[br]
  87. [*Effects: ] Constructs an instance of `reverse_iterator` with `m_iterator`
  88. default constructed.
  89. explicit reverse_iterator(Iterator x);
  90. [*Effects: ] Constructs an instance of `reverse_iterator` with
  91. `m_iterator` copy constructed from `x`.
  92. template<class OtherIterator>
  93. reverse_iterator(
  94. reverse_iterator<OtherIterator> const& r
  95. , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
  96. );
  97. [*Requires: ] `OtherIterator` is implicitly convertible to `Iterator`.[br]
  98. [*Effects: ] Constructs instance of `reverse_iterator` whose
  99. `m_iterator` subobject is constructed from `y.base()`.
  100. Iterator const& base() const;
  101. [*Returns: ] `m_iterator`
  102. reference operator*() const;
  103. [*Effects: ] Iterator tmp = m_iterator; return *--tmp;
  104. reverse_iterator& operator++();
  105. [*Effects: ] `--m_iterator`[br]
  106. [*Returns: ] `*this`
  107. reverse_iterator& operator--();
  108. [*Effects: ] `++m_iterator`[br]
  109. [*Returns: ] `*this`
  110. [endsect]