fork(5) download
  1. #include <iterator>
  2.  
  3. struct Position {
  4. int* p;
  5. Position(int* p) : p(p) {}
  6.  
  7. int& dereference() const; // Получение текущего элемента.
  8. bool equal(const Position& other) const; // Проверка на равенство.
  9. void increment(); // Перемещение вперед.
  10. void decrement(); // Перемещение назад.
  11. void advance(std::ptrdiff_t n); // Перемещение на "n" элементов.
  12. std::ptrdiff_t distance_to(const Position& other) const; // Расстояние до другой позиции.
  13. };
  14.  
  15. struct iterator : std::iterator<std::random_access_iterator_tag, int /* Тип элемента */> {
  16. // Вложенный объект Position, и конструктор для него.
  17. Position pos;
  18. iterator(Position pos) : pos(pos) {}
  19.  
  20. // Операции, необходимые для всех категорий итераторов.
  21. iterator() = default;
  22. iterator(const iterator&) = default;
  23. iterator& operator=(const iterator&) = default;
  24. ~iterator() = default;
  25. reference operator*() const { return pos.dereference(); }
  26. iterator& operator++() { pos.increment(); return *this; }
  27. iterator operator++(int) { auto old = *this; ++(*this); return old; }
  28.  
  29. // Операции, необходимые для InputIterator.
  30. pointer operator->() const;
  31.  
  32. // Операции, необходимые для BidirectionalIterator.
  33. iterator& operator--() { pos.decrement(); return *this; }
  34. iterator operator--(int) { auto old = *this; --(*this); return old; }
  35.  
  36. // Операции, необходимые для RandomAccessIterator.
  37. reference operator[](difference_type n) const { auto tmp = *this; tmp += n; return *tmp; }
  38. iterator& operator+=(difference_type n) { pos.advance(n); return *this; }
  39. iterator& operator-=(difference_type n) { return *this += -n; }
  40. };
  41.  
  42. // Операции, необходимые для всех категорий итераторов.
  43. void swap(iterator& a, iterator& b) { std::swap(a.pos, b.pos); }
  44.  
  45. // Операции, необходимые для InputIterator.
  46. bool operator==(const iterator& lhs, const iterator& rhs) { return lhs.pos.equal(rhs.pos); }
  47. bool operator!=(const iterator& lhs, const iterator& rhs) { return !(lhs == rhs); }
  48.  
  49. // Операции, необходимые для RandomAccessIterator.
  50. bool operator<(const iterator& lhs, const iterator& rhs) { return lhs.pos.distance_to(rhs.pos) > 0; }
  51. bool operator>(const iterator& lhs, const iterator& rhs) { return rhs < lhs; }
  52. bool operator<=(const iterator& lhs, const iterator& rhs) { return !(rhs > lhs); }
  53. bool operator>=(const iterator& lhs, const iterator& rhs) { return !(lhs < rhs); }
  54. iterator operator+(iterator it, iterator::difference_type n) { it += n; return it; }
  55. iterator operator+(iterator::difference_type n, iterator it) { return it + n; }
  56. iterator operator-(iterator it, iterator::difference_type n) { it -= n; return it; }
  57. iterator::difference_type operator-(const iterator& lhs, const iterator& rhs) { return rhs.pos.distance_to(lhs.pos); }
  58.  
  59. //----------------------------------------------------------------------------------------
  60.  
  61. int& Position::dereference() const { return *p; }
  62. bool Position::equal(const Position& other) const { return p == other.p; }
  63. void Position::increment() { ++p; }
  64. void Position::decrement() { --p; }
  65. void Position::advance(std::ptrdiff_t n) { p += n; }
  66. std::ptrdiff_t Position::distance_to(const Position& other) const { return other.p - p; }
  67.  
  68. #include <iostream>
  69. #include <algorithm>
  70.  
  71. int main() {
  72. int arr[5] = {5,4,3,2,1};
  73. iterator first(arr), last(arr+5);
  74.  
  75. std::sort(first, last);
  76.  
  77. for (auto x : arr) std::cout << x << '\n';
  78. }
  79.  
Success #stdin #stdout 0s 16064KB
stdin
Standard input is empty
stdout
1
2
3
4
5