Advertisement
RobertDeMilo

RB1.10 Автоматический вывод типа, возвращаемого функцией

Apr 15th, 2024
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.12 KB | None | 0 0
  1. #include <iostream>
  2. #include <utility>
  3. #include <vector>
  4. #include <set>
  5. #include <queue>
  6.  
  7. using namespace std;
  8.  
  9. // Пару итераторов представляем в виде шаблонного класса
  10. template<typename Iterator>
  11. class IteratorRange
  12. {
  13. private:
  14.     Iterator first, last;
  15.  
  16. public:
  17.     IteratorRange(Iterator f, Iterator l): first(f), last(l){}
  18.  
  19.     Iterator begin() const
  20.     {
  21.         return first;
  22.     }
  23.     Iterator end() const
  24.     {
  25.         return last;
  26.     }
  27. };
  28.  
  29. //template<typename T>
  30. //IteratorRange<typename vector<T>::iterator> Head(vector<T>& v, size_t top)
  31. //{
  32. //    // min берем для того случая когда хотим 3 элемента, а векторе их всего 2
  33. //    return { v.begin(), next(v.begin(), min(top,v.size())) };
  34. //}
  35.  
  36. //template<typename Container>
  37. //IteratorRange<typename Container::iterator> Head(Container& 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 Container>
  44. auto Head(Container& v, size_t top)
  45. {
  46.     // min берем для того случая когда хотим 3 элемента, а векторе их всего 2
  47.     return IteratorRange{ v.begin(), next(v.begin(), min(top,v.size())) };
  48. }
  49.  
  50. template <typename T>
  51. size_t RangeSize(IteratorRange<T> r)
  52. {
  53.     return r.end() - r.begin();
  54. }
  55.  
  56. // Порождающая функция
  57. template <typename Iterator>
  58. IteratorRange<Iterator> MakeRange(Iterator begin, Iterator end)
  59. {
  60.     return IteratorRange<Iterator> {begin, end};
  61. }
  62.  
  63. int main()
  64. {
  65.     vector<int> v = { 1,2,3,4,5 };
  66.  
  67.     for (int& x : Head(v, 3))
  68.     {
  69.         ++x;
  70.     }
  71.  
  72.     set<int> nums = { 5,7,12,8,10,5,6,1 };
  73.  
  74.     for (int x : Head(nums, 4))
  75.     {
  76.         cout << x << ' ';
  77.     }
  78.     cout << endl;
  79.  
  80.     const deque<int> nums2 = { 5,7,12,8,10,5,6,1 };
  81.  
  82.     for (int x : Head(nums2, 4))
  83.     {
  84.         cout << x << ' ';
  85.     }
  86.     cout << endl;
  87.  
  88.     return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement