Класс-итератор c++

303
14 сентября 2017, 17:30

Доброго времени суток! У меня есть класс для хранения двусвязного списка (аналог std::list), мне нужно написать класс-итератор перебирающий элементы списка при вызове оператора ++, для которого определены операторы * и →;

Answer 1

Для двусвязного списка вы можете реализовать двунаправленный итератор.

1) Нужен конструктор по умолчанию, копирующий конструктор и копирующий оператор присваивания.

Is default-constructible, copy-constructible, copy-assignable and destructible

X a;
X b(a);
b = a;

2) Должны быть определены операторы == и !=

Can be compared for equivalence using the equality/inequality operators (meaningful when both iterator values iterate over the same underlying sequence).

a == b
a != b

3) Должны быть определены операторы * и ->

Can be dereferenced as an rvalue (if in a dereferenceable state).

*a
a->m

4) Для неконстантных итераторов должен быть определен оператор *, который возвращает lvalue. Ссылку, например

For mutable iterators (non-constant iterators): Can be dereferenced as an lvalue (if in a dereferenceable state).

*a = t

5) Нужны постфиксный и префиксный операторы ++

Can be incremented (if in a dereferenceable state). The result is either also dereferenceable or a past-the-end iterator. Two iterators that compare equal, keep comparing equal after being both increased.

++a 
a++
*a++

6) Нужны постфиксный и префиксный операторы --

Can be decremented (if a dereferenceable iterator value precedes it).

--a
a--
*a--

Таким образом, объявление вашего итератора будет выглядеть примерно так:

template<class T>
class List{
public:
    class iterator : public std::iterator<std::bidirectional_iterator_tag, T>{
    public:
        iterator();
        iterator(const iterator &other);
        iterator& operator=(const iterator &other);
        T &operator*() const;
        T *operator->() const;
        bool operator==(const iterator &other) const;
        bool operator!=(const iterator &o) const;
        iterator &operator++();
        iterator operator++(int);
        iterator &operator--();
        iterator operator--(int);
    };
};

Если что, можно подсмотреть как реализуют итератор другие люди

READ ALSO
Не менять размер qtablewidget при изменении размера окна

Не менять размер qtablewidget при изменении размера окна

Есть QTableWidget с двумя столбцами и 2 QGroupBox(объединенные по вертикали сплиттером)Таблица выполняет роль меню и, соответственно, не должна изменять...

230
Где найти функцию _getws()?

Где найти функцию _getws()?

В инвалидной программе используется функция _gettsПри использовании: #define UNICODE Компилятор начинает орать: '_getws' was not declared at this scope А если без...

271
Массив без выхода за пределы C++

Массив без выхода за пределы C++

Мне нужно массив или вектор без выхода за пределыЧто это такое? допустим Создаю вектор или массив на 10 символов типа int Все 10 элементов равны...

276
Проблема с библиотеками Visual Studio [требует правки]

Проблема с библиотеками Visual Studio [требует правки]

После удаления и попытки новой установки, выдаёт ошибку

162