Advertisement
Guest User

Untitled

a guest
May 26th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.81 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <vector>
  4. #include <iterator>
  5. using namespace std;
  6.  
  7. template <typename T>
  8. class Enumerate_Iterator
  9. {
  10. public:
  11. struct DataProxy
  12. {
  13. pair<int, T*> p;
  14. auto operator->()
  15. {
  16. return &p;
  17. }
  18. };
  19.  
  20. using value_type = pair<int, T>;
  21. using iterator_category = std::forward_iterator_tag;
  22. using difference_type = std::ptrdiff_t;
  23. using pointer = DataProxy;
  24. using reference = value_type&;
  25.  
  26. Enumerate_Iterator(T it, int idx = 0) : it_{it}, idx_{idx} {}
  27. Enumerate_Iterator(T it) : it_{it} {}
  28. Enumerate_Iterator operator++(int)
  29. {
  30. auto tmp = *this;
  31. ++it_;
  32. ++idx_;
  33. return tmp;
  34. }
  35. Enumerate_Iterator & operator++()
  36. {
  37. ++it_;
  38. ++idx_;
  39. return *this;
  40. }
  41. bool operator==(const Enumerate_Iterator &rhs) const
  42. {
  43. return this->it_ == rhs.it;
  44. }
  45. bool operator!=(const Enumerate_Iterator &rhs) const
  46. {
  47. return !(*this == rhs);
  48. }
  49. pair<int, T> operator*()
  50. {
  51. return pair<idx_, *it_>;
  52. }
  53. auto operator->() { return DataProxy{ idx_, *it }; }
  54. private:
  55. T it_;
  56. int idx_{};
  57. };
  58.  
  59. template <typename T>
  60. class enumerate
  61. {
  62. public:
  63. enumerate(T & cont) : cont{cont} {}
  64. Enumerate_Iterator<typename T::iterator> begin() { return std::begin(cont); }
  65. Enumerate_Iterator<typename T::iterator> end() { return std::end(cont); }
  66. private:
  67. T & cont;
  68. };
  69.  
  70.  
  71. int main()
  72. {
  73. std::vector<int> vals{ 2,3,2,4,6,7 };
  74.  
  75. for (auto &&[idx, val] : enumerate<std::vector<int> >(vals))
  76. cout << idx << ": " << val++ << endl;
  77.  
  78. for (auto i : vals)
  79. cout << i << ' ';
  80. cout << endl;
  81.  
  82. for (auto[index, value] : enumerate<std::vector<int> >(vals))
  83. cout << index << ": " << value << endl;
  84.  
  85. Enumerate_Iterator<std::vector<int> > it{ begin(vals) };
  86. cout << '\n' << it->first << ' ' << it->second << '\n';
  87. ++it;
  88. cout << it->first;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement