Hatred's Log Place

DON'T PANIC!

Oct 8, 2012 - 1 minute read - Comments - programming c++

Паттерн Iterator

Полезно, когда нужно перебирать последовательно какие-то данные, мне, в частности, потребовалось для перебора кодеков и форматов во C++ враппере для FFMPEG, а так же получения набора параметров и именованных констант, которые они могут принимать.

Основные идеи данного паттерна изложены по этой ссылке: http://sourcemaking.com/design_patterns/iterator, а возможные реализации на C++ здесь: * С применением методов для перемещения итератора, разыменования оного: http://sourcemaking.com/design_patterns/iterator/cpp/1 * С использованием операторов для перемещения итератора, разыменования оного: http://sourcemaking.com/design_patterns/iterator/cpp/2

Сведения эти - общетеоретические. Более практическое описание с разделением итераторов на типы приведено на cplusplus.com: http://www.cplusplus.com/reference/std/iterator/, в частности вводятся понятие следующих типов итераторов (а так же наглядная таблица, по которой можно понять какие методы и операторы должны определяться в классе-итераторе): * Input - перемещается только вперёд, доступно только чтение значения (пример: поток stdin): http://www.cplusplus.com/reference/std/iterator/InputIterator/ * Output - перемещение только вперёд, доступна только запись значений (пример: поток stdout): http://www.cplusplus.com/reference/std/iterator/OutputIterator/ * Forward - объёдиняет свойства Input и Output итераторов: http://www.cplusplus.com/reference/std/iterator/ForwardIterator/ * Bidirectional - расширяет Forward итератор для перемещения назад: http://www.cplusplus.com/reference/std/iterator/BidirectionalIterator/ * Random Access - итератор с возможностью свободного перемещения назад/вперёд на произвольное количество позиций (пример: простой массив): http://www.cplusplus.com/reference/std/iterator/RandomAccessIterator/

А что бы несколько привести итераторы к одному виду, существует класс в стандартной библиотеке, называется ~std::iterator~, почитать можно здесь: http://www.cplusplus.com/reference/std/iterator/iterator/, там же приведён простой пример итератора.