Skip to content

Instantly share code, notes, and snippets.

@glensand
Last active May 8, 2021 07:09
Show Gist options
  • Save glensand/4ed709d91ed64dead634988fc32d809c to your computer and use it in GitHub Desktop.
Save glensand/4ed709d91ed64dead634988fc32d809c to your computer and use it in GitHub Desktop.

Итераторы

Теоретическая часть и обоснование описаны здесь.

Задание

Добавить итератор к вектору и связному списку, которые мы сделали на прошлых занятиях. Интерфейс должен выглядеть так:

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 << " ";
    }
}

Если станется время (а я надеюсь вы быстро справитесь с заданием). Аналогичную работу нужно проделать со связным списком.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment