Доброго времени суток! У меня есть класс для хранения двусвязного списка (аналог std::list), мне нужно написать класс-итератор перебирающий элементы списка при вызове оператора ++, для которого определены операторы * и →;
Для двусвязного списка вы можете реализовать двунаправленный итератор.
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);
};
};
Если что, можно подсмотреть как реализуют итератор другие люди
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости