Теоретическая часть и обоснование описаны здесь.
Добавить итератор к вектору и связному списку, которые мы сделали на прошлых занятиях. Интерфейс должен выглядеть так:
class vector final
{
public:
class iterator final
{
public:
const int& operator->() const; // возвращает константную ссылку на подконтрольный элемент
int& operator->(); // аналогично, только ссылка не константная
const int& operator*() const; // разыменовывание, работает точно так же как с указателями
int& operator*(); // аналогично, не константный вариант
iterator& operator++(); // сдвигает итератор на следующий элемент коллекции,
// возвращает на него ссылку постфактум (сначала свиг потом ссылка)
iterator operator++(int); // сдвигает итератор на след. элемент, возвращает предыдущее значение
iterator& operator--(); // Аналогичны операции ++, но сдвиг происходит на предыдущий элемент
iterator operator--(int);
bool operator==(const iterator& rhs) const; // операторы сравнения итераторов
bool operator!=(const iterator& rhs) const;
bool operator<(const iterator& rhs) const;
private:
// some related data
};
//..
iterator begin(); // возвращает итератор, узказывающий на начало коллекции
iterator end(); // возвращает итератор, указывающий на конец коллекции (элемент, находящийся за последним или Null)
};
Нужно будет протестировать взаимодействие с range-based for:
// main.cpp
#include "vector.h"
#include <iostream>
int main() {
vector v;
v.push_back(0);
v.push_back(2);
v.push_back(1);
for(auto element : v){ // тот самый range - based for
std::cout << element << " ";
}
}
Если станется время (а я надеюсь вы быстро справитесь с заданием). Аналогичную работу нужно проделать со связным списком.