Итераторы
Средства STL делают широко распространённую использование итераторов посредничать среди различных алгоритмов и последовательностей, на которых они работают.Имя типа итераторов (или его префикса) указывает категорию итераторов, необходимые для этого типа.В порядке возрастания степени категории перечислены в разделе how to:
Выходные данные.Итератор вывода X может иметь только значение V косвенное на нем хранятся, после чего оно необходимо увеличить до следующего хранилище, например in (*X++ = V(*),X = V, ++X(*) илиX = V" X++).
Входные данные.Итератор ввода X может представлять значение (исключая), которое указывает конец последовательности.Если итератор ввода не сравнивает равно его значению элемент -- последовательности, он может иметь значение V косвенное обращения к файлу для нее любое число раз, например in (V = " * "X).Чтобы разработать к следующим значением или конец последовательности, инкрементируете его, как в C++X" X++ или (V = " * "X++).После инкрементируете любую копию итератора ввода, ни одна из других копий можно безопасно сравнения, разыменования или увеличить после этого.
Вперед.Передний итератор X может занять место итератора вывода для записи или итератора ввода для чтения.Однако можно читать (посредством V = " * "X), просто записи (через *X = V) до переднего итератор.Также можно выполнить несколько копий переднего итератора, каждый из которых может быть разыменован и увеличивается вне зависимости.
Двунаправленные операции.Двунаправленный итератор X может принимать положение переднего итератора.Однако можно также уменьшить двунаправленный итератор, как в выражениях --X" X--или (V = " * "X--).
Прямой доступ.Итератор с произвольным доступом X можно принять место двухнаправленного итератора.Также можно выполнять множество ту же арифметические операции целого числа в произвольно-доступном итераторе, что указатель объекта.Для Nобъект integer, можно написать x[N] x + N" x - Nи N + X.
Обратите внимание, что указатель объекта может занять место итератора произвольного доступа или любого другого итератора.Все итераторы можно присвоить или копирования.Они предполагается, что упрощенными объектами и часто передаются и возвращаются значением, а не по ссылке.Обратите внимание, что ни одна из описанных выше операций могут вызывать исключение выполняно в допустимом итераторе.
Иерархия категорий итератора может быть суммирована путем отображения последовательности 3.Для доступных только на запись доступа к последовательности, можно воспользоваться любым из следующих:
output iterator
-> forward iterator
-> bidirectional iterator
-> random-access iterator
Стрелка вправо означает "может быть заменено by". Любой алгоритм, который вызывает для итератора вывода должен работать славно с передним итератором, например, но NOT другой способ вокруг.
Для доступа только для чтения к последовательности, можно воспользоваться любым из следующих:
input iterator
-> forward iterator
-> bidirectional iterator
-> random-access iterator
Итератор ввода самые простые всех категорий, в данном случае.
Наконец, для чтения и записи в последовательности, можно воспользоваться любым из следующих:
forward iterator
-> bidirectional iterator
-> random-access iterator
Указатель объекта всегда может служить итератор с произвольным доступом, поэтому он может служить любое категория итератора, если он поддерживает правильное чтение и запись в последовательность, то он обозначает.
Итератор Iterator за исключением указателя объекта также указать типы элементов, требуемые специализацией iterator_traits<Iterator>.Обратите внимание, что это могут быть выполнены путем наследования Iterator из общего базового класса итератор.
Эта "алгебра" итераторов базовая в практических всему еще в стандартной библиотеке шаблонов.Важно понимать посылы и ограничения каждой категории итератора увидеть, как итераторы используются контейнерами и алгоритмом в STL.
![]() |
---|
Можно также использовать для каждого внутри прохода по коллекциям STL.Дополнительные сведения см. в разделе Как Выполните итерацию по коллекции для каждого с STL. |
Visual C++ теперь содержит проверяемых итераторы и отладки итераторы, чтобы убедиться, что не перезапишете границы контейнера.Дополнительные сведения см. в разделах Проверяемые итераторы и Поддержка итераторов отладка.