fork download
  1. #include <vector>
  2. #include <string>
  3. #include <list>
  4. #include <type_traits>
  5. #include <iostream>
  6. #include <iterator>
  7.  
  8. using T = std::string;
  9. using VectT = std::vector<T>;
  10. using ListT = std::list<VectT>;
  11.  
  12. using value_type = T;
  13.  
  14. class const_iterator :
  15. public std::iterator<std::bidirectional_iterator_tag , value_type const> {
  16. public:
  17. using ListIt = typename ListT::const_iterator;
  18. using VectIt = typename VectT::const_iterator;
  19.  
  20. explicit const_iterator(ListIt itHigh, VectIt itLow) :
  21. itHigh_{itHigh}, itLow_{itLow} {
  22. }
  23.  
  24. const_iterator(const const_iterator &it) :
  25. itHigh_{it.itHigh_}, itLow_{it.itLow_} {
  26. }
  27.  
  28. const_iterator & operator ++ () {
  29. std::cout << "increment" << std::endl;
  30. itLow_++;
  31. if (itLow_ == itHigh_->end()) {
  32. itHigh_++;
  33. itLow_ = itHigh_->begin();
  34. }
  35.  
  36. return *this;
  37. }
  38.  
  39. const_iterator operator ++ (int) {
  40. const_iterator retval = *this;
  41.  
  42. ++(*this);
  43.  
  44. return retval;
  45. }
  46.  
  47. const_iterator & operator -- () {
  48. std::cout << "decrement" << std::endl;
  49. itLow_--;
  50. if (itLow_ == --itHigh_->begin()) {
  51. itHigh_--;
  52. itLow_ = --(itHigh_->end());
  53. }
  54.  
  55. return *this;
  56. }
  57.  
  58. const_iterator operator -- (int) {
  59. const_iterator retval = *this;
  60.  
  61. --(*this);
  62.  
  63. return retval;
  64. }
  65.  
  66. bool operator == (const_iterator other) const {
  67. return other.itHigh_ == itHigh_&& other.itLow_ == itLow_;
  68. }
  69.  
  70. bool operator != (const_iterator other) const {
  71. return !(other == *this);
  72. }
  73.  
  74. const value_type & operator * () const {
  75. return *itLow_;
  76. }
  77.  
  78. const value_type * operator -> () const {
  79. return &(operator *());
  80. }
  81.  
  82. private:
  83. ListIt itHigh_;
  84. VectIt itLow_;
  85. };
  86.  
  87. int main() {
  88. std::cout
  89. << std::is_same<typename std::iterator_traits<const_iterator>::value_type, std::string const>::value
  90. << std::endl;
  91.  
  92. ListT items = {{"First", "Second"}, {"Third", "Fourth"}, {"Fifth", "Sixth", "Seventh"}};
  93.  
  94. const_iterator it{items.begin(), items.begin()->begin()};
  95.  
  96. const_iterator end{items.end(), items.end()->begin()};
  97.  
  98. for (; it != end; it++) {
  99. std::cout << *it << " ";
  100. }
  101. std::cout << std::endl;
  102.  
  103. using const_reverse_iterator = std::reverse_iterator<const_iterator>;
  104.  
  105. const_reverse_iterator rit{const_iterator{(--items.end()), --items.rbegin()->rbegin().base()}};
  106.  
  107. const_reverse_iterator rend{const_iterator{items.begin(), --items.rend()->end()}};
  108.  
  109. /*for (; rit != rend; rit++) {
  110.   std::cout << *rit << " ";
  111.   }*/
  112. rit--;
  113. --rit;
  114. rit++;
  115. ++rit;
  116. std::cout << *rit << std::endl;
  117. *rit;
  118. *rit;
  119.  
  120. std::cout << std::endl;
  121. }
  122.  
Success #stdin #stdout 0s 15248KB
stdin
Standard input is empty
stdout
1
First increment
Second increment
Third increment
Fourth increment
Fifth increment
Sixth increment
Seventh increment

increment
increment
decrement
decrement
decrement
Sixth
decrement
decrement