Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Порождающие функции
- // Преимущества - сокращают код, перекладывая на компилятор вывод
- // параметров шаблона
- // Недостатки - их нужно писать самому.
- // auto full = MakeRange(t.begin(),t.end()) - неочевиден тип переменной full
- #include <iostream>
- #include <vector>
- using namespace std;
- // Пару итераторов представляем в виде шаблонного класса
- template<typename Iterator>
- struct IteratorRange
- {
- Iterator first, last;
- Iterator begin() const
- {
- return first;
- }
- Iterator end() const
- {
- return last;
- }
- };
- template<typename T>
- IteratorRange<typename vector<T>::iterator> Head(vector<T>& v, size_t top)
- {
- // min берем для того случая когда хотим 3 элемента, а векторе их всего 2
- return { v.begin(), next(v.begin(), min(top,v.size())) };
- }
- // IteratorRange это не тип, это шаблон типа
- // чтобы из шаблона создать конкретный тип его нужно инстанцировать
- // IteratorRange<T> r - конкретный тип
- template <typename T>
- size_t RangeSize(IteratorRange<T> r)
- {
- return r.end() - r.begin();
- }
- // Порождающая функция
- template <typename Iterator>
- IteratorRange<Iterator> MakeRange(Iterator begin, Iterator end)
- {
- return IteratorRange<Iterator> {begin, end};
- }
- int main()
- {
- vector<int> v = { 1,2,3,4,5 };
- for (int& x : Head(v, 3))
- {
- ++x;
- }
- for (int x : v)
- {
- cout << x << ' ';
- }
- cout << endl;
- /*IteratorRange <vector<int>::iterator> second_half{ v.begin() + v.size() / 2, v.end() };*/
- auto second_half = MakeRange(v.begin() + v.size() / 2, v.end());
- for (int x : second_half)
- {
- cout << x << ' ';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement