Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Чтобы по объекту класса можно было проитерироваться с помощью цикла for,
- // он должен иметь методы begin() и end()
- // Методы begin() и end() должны возвращать итераторы
- // Range - based for итерируется по коллекции и чтобы по ней проитерироваться
- // нужно каким-то образом узнать, где она начинается и где заканчивается
- // Range - based for это делает вызывая у переданного объекта методы begin() и end(), которые
- // должны возвращать итераторы
- // Поэтому чтобы разрешить итерацию с помощью range_based for по классу, созданному из шаблона
- // IteratorRange нужно добавить ему методы begin() и end()
- #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())) };
- }
- //template<typename T>
- //vector<T> Head(vector<T>& v, size_t top)
- //{
- // // min берем для того случая когда хотим 3 элемента, а векторе их всего 2
- // return { v.begin(), next(v.begin(), min(top,v.size())) };
- //}
- // Можем возвращать пару итераторов на вектор и терироваться по ним
- int main()
- {
- vector<int> v = { 1,2,3,4,5 };
- /*for (int x : v)
- {
- cout << x << ' ';
- }*/
- /*for (int i = 0; i < 3; ++i)
- {
- cout << v[i] << ' ';
- }*/
- /*for (int x : Head(v,3))
- {
- cout << x << ' ';
- }*/
- for (int& x : Head(v, 3))
- {
- ++x;
- }
- for (int x : v)
- {
- cout << x << ' ';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement