|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
Иттераторы23.01.2010, 05:05. Показов 4149. Ответов 20
Метки нет (Все метки)
Никогда не пользовался, а теперь хочу разобраться. Запостите, пожалуйста ответы на вопросы:
1. Что такое иттераторы? 2. Как их делать? 3. Как ими пользоваться? 4. Каким образом при этом достигается ускорение?
0
|
|
| 23.01.2010, 05:05 | |
|
Ответы с готовыми решениями:
20
Инкапсуляция, иттераторы, абстрактные списки на С Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
9715 / 6470 / 52
Регистрация: 06.03.2009
Сообщений: 28,500
|
|
| 23.01.2010, 07:03 | |
|
настолько лень приложить усилие? http://ru.wikipedia.org/wiki/%... 0%BE%D1%80
0
|
|
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|||||||||||
| 23.01.2010, 07:42 [ТС] | |||||||||||
|
Айси. Иттератор похож на указатель, но в операторах сложения/вычитания и инкремента/декремента проверяет выход за границу контейнера? Если я точно знаю, что у меня динамический массив, то в чём преимущество? Каким образом можно достичь ускорения по сравнению с индексом? Зачем мне вообще что добавлять в начало во время перебора? А если я добавлю хоть что то в динамический массив (даже в конец), то каким образом сохранятся адреса элементов массива? Индекс я могу сравнивать с нулём, что быстрее, а иттератор придётся сравнивать с указателем на вершину, что медленнее. По-моему перенос тормоза со сложения с базой в декремент адреса и всего делов. Подозреваю у себя ошибку. Где она?
Добавлено через 6 минут
Добавлено через 1 минуту Я не спорю, а не понимаю и задаю наводящие вопросы.
0
|
|||||||||||
|
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
| 23.01.2010, 09:42 | |
|
Итератор похож на указатель, а не на индекс. В приведённом примере ты со своим итератором занулил бы всю доступную память, пока тебя не остановил бы сбой. Многие итераторы не проверяются, проверять их ты должен сам. В данном случае условие надо было написать как p>=c.begin();
Суть итераторов заключается в том, что они ИМИТИРУЮТ поведение указателей на массиве. Причём имитировать это поведение они могут и на других структурах данных - списках, деревьях и т.д. Таким образом ты можешь единообразно работать с разными по своей природе контейнерами, не заморачиваясь деталями их реализации. Аналогично, при разработке своих контейнеров имеет смысл разработать для них итераторы, имеющие такое же поведение. Эта идея замечательно развивается в понятии обобщённого программирования (см. хелп по <algorithm>). Сделанные в виде шаблонов функции вроде сортировки или перекидывания части элементов используют этот единообразный способ для того, чтобы работать с разными контейнерами. То есть, одна и та же std::sort способна сортировать и vector, и list, и deque, и твой собственный контейнер, если ты озаботился сделать для него совместимые итераторы.
0
|
|
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|||||||||||||||||
| 27.01.2010, 05:46 [ТС] | |||||||||||||||||
Добавлено через 2 минуты Преимущество иттератора именно в универсальности? Не в скорости? Добавлено через 4 минуты
0
|
|||||||||||||||||
|
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
|
||
| 27.01.2010, 11:15 | ||
|
1
|
||
|
373 / 287 / 97
Регистрация: 17.12.2009
Сообщений: 567
|
|||||||||||
| 28.01.2010, 04:55 | |||||||||||
|
что то типа этого, черт его знает, как правельнее сделать
похоже вот так:
1
|
|||||||||||
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
| 28.01.2010, 05:01 [ТС] | |
|
Эйси.
1. Класс иттератора объявляется внутри класса контейнера. 2. В нём делаеются два конструктора: дефолтный и с параметром-указателем. 3. Единственное данное - указатель. 4. Объявляется оператор приведения к ссылке. Так? Добавлено через 1 минуту А что за оператор it? Добавлено через 2 минуты А можно в коде оператора-члена, объявленного в иттераторе, получить доступ к полям контейнера? Как?
0
|
|
|
373 / 287 / 97
Регистрация: 17.12.2009
Сообщений: 567
|
|
| 28.01.2010, 05:18 | |
|
1-4 все так!!! но это мой собственный пример, в stl контейнирах в С++ итераторы описаны намного сложнее. и служат намного болие широким целям, у Бьерна Страуструпа в "Язык программирования C++" все описано по поводу итераторов и контейнеров.
важно что класс итератора внутри класса контейнера, потму что обычно это все шаблонные классы и класс итератора зависит от класса контейнера. остальное - как придется... it это не оператор ))) это же обькет - экземпляр класса TArray::iterator.нельзя!!! никак!!! в этом вся соль, больше абстракции - легче работа. например: ты же понятия не имеешь как устроен итератор стандартного контейнера map, а пользуешься им весьма эфективно! а между тем попробуй посмотри как он устоен - мозг можно поломать. так что не надо рыться в реалезации, надо просто очено точно и эфективно реализовывать интерфейс (доступные пользователю методы и поля данных) Comprenez-vous?
0
|
|
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|||||||||||||||
| 28.01.2010, 05:37 [ТС] | |||||||||||||||
Добавлено через 2 минуты
0
|
|||||||||||||||
|
373 / 287 / 97
Регистрация: 17.12.2009
Сообщений: 567
|
||||||
| 28.01.2010, 05:38 | ||||||
|
можно получить только если чрез другие итераторы, как и видно из релизации выше:
__________________________ для каждого конетейнера свой тип итератора и итераторы не наследуют какой то один базовый класс, а универсатьность есть: она проявлется в том что все функции из <algorithm> могут обрабатывать любые контейнеры, даже C-строки! только я не знаю как это реализовано, и тут не могу помоч ![]() дикремента у итераторов еще не встречал, но врядли это очень плохо...
0
|
||||||
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|||||||
| 28.01.2010, 05:43 [ТС] | |||||||
0
|
|||||||
|
373 / 287 / 97
Регистрация: 17.12.2009
Сообщений: 567
|
||||||
| 28.01.2010, 05:44 | ||||||
0
|
||||||
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||
| 28.01.2010, 05:47 [ТС] | ||
|
0
|
||
|
373 / 287 / 97
Регистрация: 17.12.2009
Сообщений: 567
|
||||||
| 28.01.2010, 05:49 | ||||||
|
так, вощем проверку на выход за предел допустимого диапозона сам класс итератора не должен предусматривать, в stl контейнерах не предусмотренно, по крайней мере. надо это извне делать
вызывать внутри класса итератора функции-члены класс контейнера не получится. не зациклится, это для операций поиска делают.
))
0
|
||||||
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||
| 28.01.2010, 05:57 [ТС] | ||
|
0
|
||
|
373 / 287 / 97
Регистрация: 17.12.2009
Сообщений: 567
|
||||||
| 28.01.2010, 06:08 | ||||||
|
для прохода итератора от конца контейнера к началу делают
iterator TArray::rbegin() и iterator TArray::rend() - типа реверсивные begin() и end(). и вот у них operator++ будет гнать итератор от конца к началу.
0
|
||||||
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||
| 28.01.2010, 06:09 [ТС] | ||
|
Допустим. пусть я иду от begin() и дошёл до конца.
0
|
||
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
| 28.01.2010, 06:20 [ТС] | |
|
От произвольного элемента как перебирать? Предположим, я хочу перебрать от указателя на середину массива до начала. rbegin юзить нельзя, так как он начнёт с конца, а у меня конкретный указатель, с которого надо начать. Не указав реверс, цикл пойдём к концу, а мне надо к началу.
Добавлено через 46 секунд Другой тип? Понятно. Это решает и проблему произвольного старта. Добавлено через 55 секунд Но всё же каков end() для списка?
0
|
|
|
Новые блоги и статьи
|
|||
|
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает
Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|