Страницы

Поиск по вопросам

среда, 27 ноября 2019 г.

Что такое итераторы и зачем они нужны

#итераторы #c++


Вот не могу понять основное предназначение итераторов . Погуглив , все равное не понял.

Пожалуйста объясните:


Что такое итератор?
Зачем он нужен?
Преимущества на указателем
Как его описать программно в коде? (то есть сделать свой итератор
подобный библиотечным).

    


Ответы

Ответ 1



Смотрите. Пускай у вас есть контейнер. Неважно какой: map, vector, set. Он содержит набор элементов. И вы хотите сослаться не на весь контейнер, а на какое-то место в этом наборе элементов. Так чтобы от этого места можно было перейти вперёд/назад, и что-то в этом месте сделать: изменить элемент, вставить элемент, удалить элемент. Как это сделать? Для массива вы в таких случаях пользуетесь индексом. set внутри является красно-чёрным деревом, так что вам понадобится ссылка на узел этого дерева. unordered_map использует хэш-таблицу, так что вам нужна пара из хэш-индекса и указателя на элемент внутри bucket'а. Чтобы не приходилось писать алгоритмы, специфические для каждого контейнера, и были придуманы итераторы. Итератор — структура данных, которая «указывает» на некоторый элемент контейнера, и (для некоторых контейнеров) умеет переходить к предыдущему/следующему элементу. Если вы хотите реализовать итератор, помните, что существуют разные типы итераторов, в зависимости от операций, которые они предоставляют. Вот список возможных типов. Если вы, например, хотите реализовать RandomAccessIterator, вам придётся определить конструктор копирования, оператор присваивания, деструктор, операции ==, !=, *, ->, конструктор без аргументов, ++, --, +=, + (2 шт.), -=, - (2 шт.), <, >, <=, >=. (Другие типы итераторов попроще.) Кроме того, вам придётся специфицировать std::iterator_traits, где It — тип вашего итератора. Вот вам заготовка для собственного контейнера на SO. Немало, правда?

Ответ 2



Итератор - это объект, который позволяет перемещаться (итерироваться) по элементам некоторой последовательности. Использование таких объектов классифицируется как паттерн программирования Итератор. Последовательность может быть как готовым набором объектов в памяти, так и состоять объектов которые создаются "на лету" при перемещении итератора (например читаются из файла). В отличие от разнообразных последовательностей элементов (массивы, списки, файлы), итераторы имеют одинаковый интерфейс: получение текущего элемента, перемещение к следующему. Это позволяет писать более общие алгоритмы, которые работают с любыми итераторами, поддерживающими этот минимальный набор функций. Итераторы стандартной библиотеки C++ повторяют интерфейс указателя. Это позволяет использовать указатели на элементы массива в качестве итераторов. При этом большинство алгоритмов используют только некоторый минимальный набор операций, например только перемещение вперед. Этот набор операций называется категорией, список всех категорий итераторов перечислен тут. Варианты написания своего итератора есть в ответах к этому вопросу.

Комментариев нет:

Отправить комментарий