|
4 / 4 / 0
Регистрация: 27.12.2010
Сообщений: 56
|
|
Итератор ?16.08.2011, 16:27. Показов 9940. Ответов 40
Метки нет (Все метки)
Как выглядит итератор на вложеный контейнер? Например осуществить доступ к 1-му символу 3-го элемента в векторе vector< <vecrot<char> > vec через индекс можно так vec[2][0]. А как через итератор?
0
|
|
| 16.08.2011, 16:27 | |
|
Ответы с готовыми решениями:
40
Реализовать двусвязный список (list), итератор (iterator) и константный итератор (сonst_iterator) для списка итератор Итератор |
|
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
|
|||||||||||||||||
| 17.08.2011, 07:28 | |||||||||||||||||
Сообщение было отмечено как решение
Решение Много написал про это Элджер. У него вообще весьма хорошая книга про указатели.Добавлю: Доступ к элементам контейнера Одной из важнейших характеристик является доступ к элементам контейнера. Обычно различают прямой, последовательный и ассоциативный доступ. Прямой доступ к элементу — это доступ по номеру (или, еще говорят, по индексу) элемента. Именно таким образом мы обращаемся к элементам массива, Выражение v[7] означает, что мы хотим оперировать элементом контейнера v, имеющим номер (индекс) 7. Нумерация элементов может начинаться, вообще говоря, с любого числа, однако в С++ принято нумерацию начинать с нуля, так как для массивов (которые являются частным случаем контейнера) принята именно такая нумерация. Последовательный доступ отличается тем, что мы не имеем в распоряжении индексов элементов, зато можем перемешаться последовательно от элемента к элементу. Можно считать, что существует невидимая «стрелка»-индикатор, которую перемещают по элементам контейнера с помощью некоторого множества операций. Тот элемент, на который в данный момент «стрелка» показывает, называется текущим элементом. Обычно набор операций последовательного доступа включает следующие: - перейти к первому элементу, - перейти к последнему элементу, - перейти к следующему элементу, - перейти к предыдущему элементу, - перейти на n элементов вперед (от первого в сторону последнего элемента контейнера), - перейти на n элементов назад (от конца к началу контейнера), - получить (изменить) значение текущего элемента. Эти операции могут быть представлены в функциональной форме, например, так
6
|
|||||||||||||||||
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|||||||
| 17.08.2011, 08:58 | |||||||
итератора. Сначала выполняется операция итератора +. а затем операция итератора * (разыменование).
0
|
|||||||
|
Заблокирован
|
||
| 17.08.2011, 15:40 | ||
|
Интерпретировать итераторы, как исключительно для последовательного обхода - это на самом деле сужение понятия итератора, которое выражено в стандарте С++. В стандарте С++ прямо говорится, что итераторы - это обобщение указателей. А, как известно, указатели обладают арифметикой указателей, то есть арифметикой произвольного доступа. Поэтому, строго говоря, итераторы должны соответствовать возможностям указателей. И исходный пример решения вопроса темы как раз демонстрирует такое поведение итераторв, так как к итератору вектора в представленных примерах непосредственно прибавляется целочисленное выражение. То есть примеры этой темы как раз совершенно не демонстрируют такое узкое понимание, как исключительно последовательный доступ. То есть я хочу отметить, что не следует пытаться переиначивать смысл стандарт, сужая значения понятий, данных в стандарте.
0
|
||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||
| 17.08.2011, 15:57 | ||
|
Добавлено через 21 секунду *инкремент в смысле, а не ++
0
|
||
|
Заблокирован
|
||
| 17.08.2011, 16:48 | ||
|
Например, для шаблонного класса вектор очень часто итератор реализуется в виде обычного указателя. Поэтому вы никакой разницы не заметите, используется ли разработчиками класса вектор итератор в виде обычного указателя, или в виде отдельного класса. В этом и состоит смысл итераторов, чтобы вы не видели разницу между работой с итераторами в виде классов и с обычными указателями.
0
|
||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|||
| 17.08.2011, 17:16 | |||
|
Даже для вектора итераторы не всегда могут быть простыми указателями, т.к. итераторы обратного обхода (reverse iterator) нельзя просто заменить указателем. Т.е. взаимозаменяемы исключительно (forward)итератор и указатель. Всё! Но это лишь малое подмножество всех возможных итераторов. Итераторы предназначены для единообразного обхода любых контейнеров, поддерживающих итераторы. Что, потенциально, даёт возможность взаимозаменяемости контейнеров, но в первую очередь служит для снижения сложности.
0
|
|||
|
Заблокирован
|
||
| 17.08.2011, 21:08 | ||
|
Что общего у итераторв с указателями? Да, практически, все! То есть если вы возьмете итератор произвольного доступа, то вы не найдете никаких отличий! В этом и состоит смысл введения итераторов! Естественно, что некоторые контейнеры накладывают ограничения на возможности итераторов. Но это не меняет суть вопроса! И вы глубоко заблуждаетесь, что для вектора, у которого итератором может служить простой указатель, нельзя делать обратный обход!?! И даже для итератора вектора, который не является обычным указателем, можно делать обратный обход! ВЫ просто демонстрируете свое полное незнание стандартного класса вектор! Итератор класса вектор является [I]итератором произвольного доступа, как и у обычных массивов[/I] А это значит вы можете применять любую операцию, которая является корректной для указателей. То есать вы можете не только делать операцию инкримента, но и операцию декримента для обратного обхода! Более того, если бы вы внимательно посмотрели эту тему, то увидели, что здесь используются в примерах выражения вида v.begin() + 4, а это означает, что вы также можете и вычитать из итератора вектора, а, значит, и делать обратный обход!
0
|
||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 17.08.2011, 23:36 | |
|
Сыроежка, Скорее вы. Вам одно говорят, вы другое отвечаете. Говорилось, что контейнеров стандартных много, а не только вектор. Итератор не есть указатель. А reverse_iterator не сможет работать с простым указателем. Но вы все переиначили и опять пытаетесь выставить человека дураком. Учите ка С++, а не учите других.
2
|
|
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||
| 18.08.2011, 06:25 | ||
|
0
|
||
|
4 / 4 / 0
Регистрация: 27.12.2010
Сообщений: 56
|
||
| 18.08.2011, 22:37 [ТС] | ||
0
|
||
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
| 19.08.2011, 00:59 | |
|
Romiys, чтото вроде этого
https://www.open-std.org/jtc1/... /n1905.pdf
1
|
|
|
640KB мне хватило на всё.
119 / 50 / 3
Регистрация: 07.06.2009
Сообщений: 442
|
|
| 19.08.2011, 12:20 | |
|
Итератор для "вложенного" контейнера выглядит точно также, как итератор на не вложеный контейнер.
Аналогично, индексация вложеного во что-то массива не зависит от того, куда этот массив вложен. Если у вас массив строк, то итератор для прохода по символам отдельной строки не будет иметь особенность связанную с тем, что эта строка находится в массиве. Один итератор можно последовательно применить как строкам из массива, так и к любым другим строкам.
0
|
|
|
Заблокирован
|
||||||||||
| 19.08.2011, 21:39 | ||||||||||
Добавлено через 1 минуту Добавлено через 3 минуты Добавлено через 1 минуту
0
|
||||||||||
| 19.08.2011, 21:53 | |||||||||
0
|
|||||||||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|||
| 20.08.2011, 08:43 | |||
|
Чтобы заменить reverse_iterator на указатель, нужно полностью переписывать логику работы программы.
2
|
|||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 20.08.2011, 19:28 | |
|
Сыроежка, Итератор не является понятием исключительно С++. Итератор - паттерн. Он используется во множестве языков (например Java, C#, Python), в которых нет указателей вообще. Поэтому не надо привязывать паттерн к одному языку и говорить, что итератор и указатель не отличаются. Даже в контексте CPP это не одно и то же, что вам уже говорят 4 страницы.
0
|
|
|
Заблокирован
|
|||
| 20.08.2011, 21:28 | |||
|
А вторая ваша фраза - это вообще какая-то бессмыслица. reverse_iterator для обычного указателя также является итератором произвольного доступа. Я уже сказал, что такое впечатление, что имею дело с совершенно неадекватными людьми. Зря модератор корректировал мое сообщение. Я как раз вам и говорил, что эта "особенность реализации" итераторов для вектора как раз и говорит, что итераторы являются обощением указателей, и что вы не в состоянии определить, имеете ли вы дело с обычным указателем или со специальным классом, написанным для вектора, если не посмотрите конкретно реализацию вектора. Об этом и речь. Честно говоря, я не знаю, сколько вам раз нужно повторять одно и тоже. Я уже это повторил не меньше 5 раз. Так что проблема данной дискуссии - это проблема того, насколько вы воьбще способны понимать, что вам пишут. Я вам ранее написал, что итератор вектора может быть реализован либо в виде класса, либо в виде обычного указателя. Сейчас вы по прошествии с десяток сообщений, фактически, цитируете меня, правда сами не понимаете смысла того, что вы процитировали, и что эта цитата подтверждает. До этого вы вообще утверждали, что reverse_iterator нельзя использовать с обычными указателями. Меня всегда поражает в подобных дискуссиях одно: почему-то невежды, которые имеют обрывочные знания о языке С++ особенно агрессивны и упрямы. Вместо того, чтобы спросить, например, как применить reverse_iterator к обычному указателю, они начинают нести ахинею, что reverse_iterator нельзя применить к обычным указателям. Добавлено через 23 минуты И я не говорил нигде, что итератор и указатель это одно и тоже. Это вы просто не в состоянии понять, что вам пишут, и что заложено в С++. Я говорил, что в С++ ( обратите внимание на такое странное для вас обозначение, как С++) итератор - это обобщение указателя. Я говорил, что вы можете итератором произвольного доступа заменить указатель и наоборот. И наглядной демонстрацией этого служит реализация шаблонного класса вектор в разных компиляторах, когда в одних случаях используется для вектор обычный указатель, а в других случаях разработчики компилляторов пишут класс итератора.
0
|
|||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||
| 20.08.2011, 21:29 | ||
|
Не по теме: Сыроежка, Сказали ведь, что я не то имел ввиду. Прекрасно можно применить.
1
|
||
| 20.08.2011, 21:38 | |
Сообщение было отмечено как решение
РешениеНе по теме: ForEveR, бесполезно, это четвертый форум, где я его наблюдаю, с трех других его так или иначе поперли :D
5
|
|
|
Заблокирован
|
||
| 20.08.2011, 21:47 | ||
|
Так что вы собираетесь в моих высказываниях опровергнуть? Но более того, как я уже сказал, у вас проблемы с пониманием того, что вам пишут! Я не говорил, что итератор - это концепция С++! Я говорил, что одинаковые термины в разных языках имеют серьезные семантические различия! Так что нельзя безусловно переносить одинаковый термин из одного языка в другой. Кто-то здесь говорил, что в другом языке, не С++, вообще нет указателей! А в С++ указатели есть, и указатель является частным случаем итераторов, то есть является итератором произволбного доступа.
0
|
||
| 20.08.2011, 21:47 | |
|
Помогаю со студенческими работами здесь
40
итератор Итератор Итератор Итератор!!!!! Итератор С++ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|