Advertisement
RobertDeMilo

RB1.6 Интеграция пользовательского класса в цикл for

Apr 15th, 2024
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.47 KB | None | 0 0
  1. // Чтобы по объекту класса можно было проитерироваться с помощью цикла for,
  2. // он должен иметь методы begin() и end()
  3.  
  4. // Методы begin() и end() должны возвращать итераторы
  5.  
  6. // Range - based for итерируется по коллекции и чтобы по ней проитерироваться
  7. // нужно каким-то образом узнать, где она начинается и где заканчивается
  8.  
  9. // Range - based for это делает вызывая у переданного объекта методы begin() и end(), которые
  10. // должны возвращать итераторы
  11.  
  12. // Поэтому чтобы разрешить итерацию с помощью range_based for по классу, созданному из шаблона
  13. // IteratorRange нужно добавить ему методы begin() и end()
  14.  
  15. #include <iostream>
  16. #include <vector>
  17.  
  18. using namespace std;
  19.  
  20. // Пару итераторов представляем в виде шаблонного класса
  21. template<typename Iterator>
  22. struct IteratorRange
  23. {
  24.     Iterator first, last;
  25.  
  26.     Iterator begin() const
  27.     {
  28.         return first;
  29.     }
  30.     Iterator end() const
  31.     {
  32.         return last;
  33.     }
  34. };
  35.  
  36. template<typename T>
  37. IteratorRange<typename vector<T>::iterator> Head(vector<T>& v, size_t top)
  38. {
  39.     // min берем для того случая когда хотим 3 элемента, а векторе их всего 2
  40.     return { v.begin(), next(v.begin(), min(top,v.size())) };
  41. }
  42.  
  43. //template<typename T>
  44. //vector<T> Head(vector<T>& v, size_t top)
  45. //{
  46. //  // min берем для того случая когда хотим 3 элемента, а векторе их всего 2
  47. //  return { v.begin(), next(v.begin(), min(top,v.size())) };
  48. //}
  49.  
  50. // Можем возвращать пару итераторов на вектор и терироваться по ним
  51. int main()
  52. {
  53.     vector<int> v = { 1,2,3,4,5 };
  54.  
  55.     /*for (int x : v)
  56.     {
  57.         cout << x << ' ';
  58.     }*/
  59.  
  60.     /*for (int i = 0; i < 3; ++i)
  61.     {
  62.         cout << v[i] << ' ';
  63.     }*/
  64.  
  65.     /*for (int x : Head(v,3))
  66.     {
  67.         cout << x << ' ';
  68.     }*/
  69.  
  70.     for (int& x : Head(v, 3))
  71.     {
  72.         ++x;
  73.     }
  74.  
  75.     for (int x : v)
  76.     {
  77.         cout << x << ' ';
  78.     }
  79.  
  80.     return 0;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement