HTML Diff
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 будет считывать компонент или записывать неконстантные элементы любое количество раз через *. Если нужно получить доступ к компонентам цикла, делается это через -&gt;, сравниваются iterators через == и !=. Допускается создание сразу нескольких копий однонаправленного iterator, каждая из которых может быть модифицирована.</li>
33 <li>Вперед. Это переадресация по последовательности через ++. Iterator будет считывать компонент или записывать неконстантные элементы любое количество раз через *. Если нужно получить доступ к компонентам цикла, делается это через -&gt;, сравниваются 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, пользователю необходимо в самом начале кода подключить библиотеку &lt;iterator&gt;.</p>
38 <p>Теперь предстоит изучить азы, которые нужны программисту, если он использует класс int iter. Чтобы создать iterators, пользователю необходимо в самом начале кода подключить библиотеку &lt;iterator&gt;.</p>
39 <p>Далее для создания необходимо использовать форму записи:</p>
39 <p>Далее для создания необходимо использовать форму записи:</p>
40 <p>&lt;контейнер&gt; &lt;тип (пример - int )&gt; :: &lt;ключевое слово iterator без кавычек &gt;&lt;имя_итератора&gt;;</p>
40 <p>&lt;контейнер&gt; &lt;тип (пример - int )&gt; :: &lt;ключевое слово iterator без кавычек &gt;&lt;имя_итератора&gt;;</p>
41 <p>Данная запись значит:</p>
41 <p>Данная запись значит:</p>
42 <ul><li>&lt;контейнер&gt; - указывается container, на который будет ссылаться рассматриваемый объект;</li>
42 <ul><li>&lt;контейнер&gt; - указывается container, на который будет ссылаться рассматриваемый объект;</li>
43 <li>&lt;тип&gt; - тип контейнера (чаще всего int ).</li>
43 <li>&lt;тип&gt; - тип контейнера (чаще всего 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>Соответствующие методы можно использовать, не подключая класс (библиотеку) &lt;iter&gt;. При инициализации допускается указание на "место старта":</p>
48 <p>Соответствующие методы можно использовать, не подключая класс (библиотеку) &lt;iter&gt;. При инициализации допускается указание на "место старта":</p>
49 <p>Vector &lt;int &gt; a_vector;</p>
49 <p>Vector &lt;int &gt; a_vector;</p>
50 <p>Vector &lt;int &gt;:: iter it = a_vector.brgin();</p>
50 <p>Vector &lt;int &gt;:: 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>Использовать арифметические операции: &gt;, &lt;, == допускается только с идентичными объектами. Такими, которые указывают на один и тот же container и тип (пример - int). Исключение - это создание двух iter на map.</p>
59 </ol><p>Использовать арифметические операции: &gt;, &lt;, == допускается только с идентичными объектами. Такими, которые указывают на один и тот же 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