0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<ul><li><a>Определение</a><ul><li><a>Отличие от индексации</a></li>
1
<ul><li><a>Определение</a><ul><li><a>Отличие от индексации</a></li>
2
</ul></li>
2
</ul></li>
3
<li><a>Основные типы данных</a></li>
3
<li><a>Основные типы данных</a></li>
4
<li><a>Виды итераторов</a></li>
4
<li><a>Виды итераторов</a></li>
5
<li><a>Создание</a><ul><li><a>Методы начала и конца</a></li>
5
<li><a>Создание</a><ul><li><a>Методы начала и конца</a></li>
6
<li><a>Работа с vector</a></li>
6
<li><a>Работа с vector</a></li>
7
<li><a>Работа с list, map и set</a></li>
7
<li><a>Работа с list, map и set</a></li>
8
</ul></li>
8
</ul></li>
9
</ul><p>Каждый язык программирования имеет свои собственные инструменты, компоненты и элементы, без которых невозможна реализация функций. В Си-семействе и некоторых других ЯП есть<strong>итераторы</strong>. Это важный компоненты, которые можно не только использовать в коде, но и создавать.</p>
9
</ul><p>Каждый язык программирования имеет свои собственные инструменты, компоненты и элементы, без которых невозможна реализация функций. В Си-семействе и некоторых других ЯП есть<strong>итераторы</strong>. Это важный компоненты, которые можно не только использовать в коде, но и создавать.</p>
10
<p>Далее предстоит изучить, что собой представляет iterator. Эта информация пригодится как новичкам, так и более опытным программистам. Необходимо выяснить, для чего нужны итераторы, как их создавать и использовать на практике.</p>
10
<p>Далее предстоит изучить, что собой представляет iterator. Эта информация пригодится как новичкам, так и более опытным программистам. Необходимо выяснить, для чего нужны итераторы, как их создавать и использовать на практике.</p>
11
<h2>Определение</h2>
11
<h2>Определение</h2>
12
<p>Iterator - структура данных, используемая для обращения к тем или иным элементам из STL. Интерфейс, при помощи которого можно получить доступ к компонентам коллекции (включая массивы), а также осуществлять по ним навигацию. В различных системах iterators могу иметь разные общепринятые "имена". В СУБД они описаны в качестве курсоров, в низкоуровневых языках разработки - указателями.</p>
12
<p>Iterator - структура данных, используемая для обращения к тем или иным элементам из STL. Интерфейс, при помощи которого можно получить доступ к компонентам коллекции (включая массивы), а также осуществлять по ним навигацию. В различных системах iterators могу иметь разные общепринятые "имена". В СУБД они описаны в качестве курсоров, в низкоуровневых языках разработки - указателями.</p>
13
<p>Функции итераторов в обобщенном программировании дают возможность реализовывать универсальные алгоритмы для работы с контейнерами. В C++ используются чаще всего с set и list. У векторов для обращения к компонентам в "изолированных блоках кода" применяются индексы.</p>
13
<p>Функции итераторов в обобщенном программировании дают возможность реализовывать универсальные алгоритмы для работы с контейнерами. В C++ используются чаще всего с set и list. У векторов для обращения к компонентам в "изолированных блоках кода" применяются индексы.</p>
14
<h3>Отличие от индексации</h3>
14
<h3>Отличие от индексации</h3>
15
<p>Iterator напоминает индексацию. Использование рассматриваемых структур данных в объектно-ориентированных контейнерах предоставляет несколько преимуществ. От индексации итераторы C отличаются:</p>
15
<p>Iterator напоминает индексацию. Использование рассматриваемых структур данных в объектно-ориентированных контейнерах предоставляет несколько преимуществ. От индексации итераторы C отличаются:</p>
16
<ol><li>Совместимостью. Они используются не со всеми структурами данных.</li>
16
<ol><li>Совместимостью. Они используются не со всеми структурами данных.</li>
17
<li>Предоставлением дополнительного последовательного перебора любых структур информации. Этот прием делает код более читабельным и чистым.</li>
17
<li>Предоставлением дополнительного последовательного перебора любых структур информации. Этот прием делает код более читабельным и чистым.</li>
18
<li>Некоторые контейнеры позволяют вносить модификации в свои объекты без непосредственного влияния на сам итератор. Пример - когда "система" уже прошла первый компонент, можно вставить дополнительные элементы в самое начало container без нежелательных последствий. При индексации реализовать соответствующий алгоритм проблематично.</li>
18
<li>Некоторые контейнеры позволяют вносить модификации в свои объекты без непосредственного влияния на сам итератор. Пример - когда "система" уже прошла первый компонент, можно вставить дополнительные элементы в самое начало container без нежелательных последствий. При индексации реализовать соответствующий алгоритм проблематично.</li>
19
</ol><p>За счет последнего пункта iterator стал популярным средством разработки.</p>
19
</ol><p>За счет последнего пункта iterator стал популярным средством разработки.</p>
20
<h2>Основные типы данных</h2>
20
<h2>Основные типы данных</h2>
21
<p>Тип данных присваивается переменным при их объявлении или инициализации. Он является важным компонентом разработки. В C++ поддерживаются различные типы данных:</p>
21
<p>Тип данных присваивается переменным при их объявлении или инициализации. Он является важным компонентом разработки. В C++ поддерживаются различные типы данных:</p>
22
<ul><li>int (или integer) - целочисленный;</li>
22
<ul><li>int (или integer) - целочисленный;</li>
23
<li>double - с плавающей запятой двойной точности;</li>
23
<li>double - с плавающей запятой двойной точности;</li>
24
<li>char - символьный;</li>
24
<li>char - символьный;</li>
25
<li>bool - логический (булевый);</li>
25
<li>bool - логический (булевый);</li>
26
<li>float - число с плавающей запятой.</li>
26
<li>float - число с плавающей запятой.</li>
27
</ul><p>Int - наиболее распространенный тип данных. Помнить поддерживаемые виды информации необходимо не только тем, кто планирует использовать итераторы, но и другим разработчикам.</p>
27
</ul><p>Int - наиболее распространенный тип данных. Помнить поддерживаемые виды информации необходимо не только тем, кто планирует использовать итераторы, но и другим разработчикам.</p>
28
<h2>Виды итераторов</h2>
28
<h2>Виды итераторов</h2>
29
<p>Итерация - это один проход через алгоритм заданного цикла. Характеризует повторение какого-либо действия. Организация обработки данных, при которой операции многократно повторяются, не приводя к вызовам самих себя.</p>
29
<p>Итерация - это один проход через алгоритм заданного цикла. Характеризует повторение какого-либо действия. Организация обработки данных, при которой операции многократно повторяются, не приводя к вызовам самих себя.</p>
30
<p>Итерация и итераторы цикла тесно связаны между собой. В C++ выделяют различные типы итераторов:</p>
30
<p>Итерация и итераторы цикла тесно связаны между собой. В C++ выделяют различные типы итераторов:</p>
31
<ol><li>Выход. Выходной итератор int выполняет итерацию цикла при помощи оператора ++. Записывается элемент всего один раз при помощи *.</li>
31
<ol><li>Выход. Выходной итератор int выполняет итерацию цикла при помощи оператора ++. Записывается элемент всего один раз при помощи *.</li>
32
<li>Вход. Входной итератор int выполняет итерации по последовательности при помощи ++ и считывает компонент любое количество раз через *. Их можно сравнить при помощи == и !=. После увеличения любой копии входного итератора ни одна из других не может безопасно сравниваться, переименовываться и увеличиваться.</li>
32
<li>Вход. Входной итератор int выполняет итерации по последовательности при помощи ++ и считывает компонент любое количество раз через *. Их можно сравнить при помощи == и !=. После увеличения любой копии входного итератора ни одна из других не может безопасно сравниваться, переименовываться и увеличиваться.</li>
33
<li>Вперед. Это переадресация по последовательности через ++. Iterator будет считывать компонент или записывать неконстантные элементы любое количество раз через *. Если нужно получить доступ к компонентам цикла, делается это через ->, сравниваются iterators через == и !=. Допускается создание сразу нескольких копий однонаправленного iterator, каждая из которых может быть модифицирована.</li>
33
<li>Вперед. Это переадресация по последовательности через ++. Iterator будет считывать компонент или записывать неконстантные элементы любое количество раз через *. Если нужно получить доступ к компонентам цикла, делается это через ->, сравниваются iterators через == и !=. Допускается создание сразу нескольких копий однонаправленного iterator, каждая из которых может быть модифицирована.</li>
34
<li>Двунаправленный. Двунаправленный iterator способен занять место прямого итератора. Он может быть уменьшен. Доступ к членам iter и их сравнивание осуществляется точно так же, как и однонаправленные.</li>
34
<li>Двунаправленный. Двунаправленный iterator способен занять место прямого итератора. Он может быть уменьшен. Доступ к членам iter и их сравнивание осуществляется точно так же, как и однонаправленные.</li>
35
<li>Случайного доступа. Могут занимать места двунаправленных iterators. Позволяют использовать [] для доступа к компонентам, а также -=, +=, +- для перемещения и вычисления расстояния между iterators.</li>
35
<li>Случайного доступа. Могут занимать места двунаправленных iterators. Позволяют использовать [] для доступа к компонентам, а также -=, +=, +- для перемещения и вычисления расстояния между iterators.</li>
36
</ol><p>Все рассматриваемые элементы можно назначать и копировать. Это упрощенные объекты, которые нужны для передачи и возврата по значению, а не по ссылкам.</p>
36
</ol><p>Все рассматриваемые элементы можно назначать и копировать. Это упрощенные объекты, которые нужны для передачи и возврата по значению, а не по ссылкам.</p>
37
<h2>Создание</h2>
37
<h2>Создание</h2>
38
<p>Теперь предстоит изучить азы, которые нужны программисту, если он использует класс int iter. Чтобы создать iterators, пользователю необходимо в самом начале кода подключить библиотеку <iterator>.</p>
38
<p>Теперь предстоит изучить азы, которые нужны программисту, если он использует класс int iter. Чтобы создать iterators, пользователю необходимо в самом начале кода подключить библиотеку <iterator>.</p>
39
<p>Далее для создания необходимо использовать форму записи:</p>
39
<p>Далее для создания необходимо использовать форму записи:</p>
40
<p><контейнер> <тип (пример - int )> :: <ключевое слово iterator без кавычек ><имя_итератора>;</p>
40
<p><контейнер> <тип (пример - int )> :: <ключевое слово iterator без кавычек ><имя_итератора>;</p>
41
<p>Данная запись значит:</p>
41
<p>Данная запись значит:</p>
42
<ul><li><контейнер> - указывается container, на который будет ссылаться рассматриваемый объект;</li>
42
<ul><li><контейнер> - указывается container, на который будет ссылаться рассматриваемый объект;</li>
43
<li><тип> - тип контейнера (чаще всего int ).</li>
43
<li><тип> - тип контейнера (чаще всего int ).</li>
44
</ul><p>Если указать не тот тип информации в рассматриваемом объекте, программа работать не будет. Когда контейнер является int, значит, его итератор тоже должен быть таким.</p>
44
</ul><p>Если указать не тот тип информации в рассматриваемом объекте, программа работать не будет. Когда контейнер является int, значит, его итератор тоже должен быть таким.</p>
45
<h3>Методы начала и конца</h3>
45
<h3>Методы начала и конца</h3>
46
<p>Каждый контейнер имеет два метода, которые подобно указателям передают изучаемому объекту начало и конец. Это функции begin и end.</p>
46
<p>Каждый контейнер имеет два метода, которые подобно указателям передают изучаемому объекту начало и конец. Это функции begin и end.</p>
47
<p>Begin значит перемещение iterator в самое начало контейнера. Если разработчик применил метод end, он перейдет в конец container. Система переведет "указатель" на одну ячейку больше последней.</p>
47
<p>Begin значит перемещение iterator в самое начало контейнера. Если разработчик применил метод end, он перейдет в конец container. Система переведет "указатель" на одну ячейку больше последней.</p>
48
<p>Соответствующие методы можно использовать, не подключая класс (библиотеку) <iter>. При инициализации допускается указание на "место старта":</p>
48
<p>Соответствующие методы можно использовать, не подключая класс (библиотеку) <iter>. При инициализации допускается указание на "место старта":</p>
49
<p>Vector <int > a_vector;</p>
49
<p>Vector <int > a_vector;</p>
50
<p>Vector <int >:: iter it = a_vector.brgin();</p>
50
<p>Vector <int >:: iter it = a_vector.brgin();</p>
51
<p>Выше представлен фрагмент, который перенаправит пользователя на самое начало контейнера a_vector.</p>
51
<p>Выше представлен фрагмент, который перенаправит пользователя на самое начало контейнера a_vector.</p>
52
<h3>Работа с vector</h3>
52
<h3>Работа с vector</h3>
53
<p>Класс итератор может работать с vector int. Для него здесь поддерживаются такие операции как:</p>
53
<p>Класс итератор может работать с vector int. Для него здесь поддерживаются такие операции как:</p>
54
<ol><li>Разыменование. В этом случае происходит обращение к значению элемента, на который указывает изучаемый объект: int x = *it.</li>
54
<ol><li>Разыменование. В этом случае происходит обращение к значению элемента, на который указывает изучаемый объект: int x = *it.</li>
55
<li>Применение инкремента it++, ++it и декремента it-, -it.</li>
55
<li>Применение инкремента it++, ++it и декремента it-, -it.</li>
56
<li>Использование арифметических операций.</li>
56
<li>Использование арифметических операций.</li>
57
<li>Сравнивание на факт равенства: if (it == it2) { …</li>
57
<li>Сравнивание на факт равенства: if (it == it2) { …</li>
58
<li>Передача переменной итераторной разницы: int X = it-it2.</li>
58
<li>Передача переменной итераторной разницы: int X = it-it2.</li>
59
</ol><p>Использовать арифметические операции: >, <, == допускается только с идентичными объектами. Такими, которые указывают на один и тот же container и тип (пример - int). Исключение - это создание двух iter на map.</p>
59
</ol><p>Использовать арифметические операции: >, <, == допускается только с идентичными объектами. Такими, которые указывают на один и тот же container и тип (пример - int). Исключение - это создание двух iter на map.</p>
60
<h3>Работа с list, map и set</h3>
60
<h3>Работа с list, map и set</h3>
61
<p>Функциональность при работе с изучаемым class для list, map, set урезана. Относительно этих компонентов нельзя:</p>
61
<p>Функциональность при работе с изучаемым class для list, map, set урезана. Относительно этих компонентов нельзя:</p>
62
<ul><li>использовать арифметические действия;</li>
62
<ul><li>использовать арифметические действия;</li>
63
<li>сравнивать "значения".</li>
63
<li>сравнивать "значения".</li>
64
</ul><p>Все остальные действия у класса итератор для list, set и map работают. Чтобы выполнять операции увеличения и уменьшения, в C++ для iter поддерживается функция advance():</p>
64
</ul><p>Все остальные действия у класса итератор для list, set и map работают. Чтобы выполнять операции увеличения и уменьшения, в C++ для iter поддерживается функция advance():</p>
65
<p>Для увеличения используется +, для уменьшения -.<a>Здесь</a>можно увидеть наглядные примеры по изученной теме. А лучше и быстрее освоить ее помогут специализированные компьютерные дистанционные курсы.</p>
65
<p>Для увеличения используется +, для уменьшения -.<a>Здесь</a>можно увидеть наглядные примеры по изученной теме. А лучше и быстрее освоить ее помогут специализированные компьютерные дистанционные курсы.</p>
66
<p>P. S. Интересует разработка? Обратите внимание на <a>курс "Программист C"</a>. Также<em>в <a>Otus</a></em>доступно множество других современных курсов.</p>
66
<p>P. S. Интересует разработка? Обратите внимание на <a>курс "Программист C"</a>. Также<em>в <a>Otus</a></em>доступно множество других современных курсов.</p>
67
67