Нужны ли итераторы там, где есть foreach |
Здравствуйте, гость ( Вход | Регистрация )
Нужны ли итераторы там, где есть foreach |
Litkevich Yuriy |
17.2.2010, 19:01
Сообщение
#1
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Вот возник у меня такой вопрос:
Цитата Нужны ли итераторы там, где есть foreach и его аналоги? Например в Qt есть оператор foreach, позволяющий перебрать элементы в контейнере. В некоторых языках программирования есть его аналог, например: Цитата for itemVar in containerVar В данный момент я вижу только одну ситуацию, где может потребоваться итератор - когда нужно получить ключ элемента, а не только значение. Например в QPair, QMap и т.п. Т.к., если я не ошибаюсь, с помощью foreach и его аналогов, нельзя понять к какому элементу относится текущее значение. |
|
|
Tonal |
17.2.2010, 20:05
Сообщение
#2
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
Итератор - очень мощная концепция.
Например с их помощью можно реализовать отложнные вычисления. (см. Boost, Python, Haskell) Кроме того, их можно передавать в обобщённые алгоритмы. foreach всего лишь один из них - самый простой. |
|
|
Litkevich Yuriy |
17.2.2010, 20:28
Сообщение
#3
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Tonal |
17.2.2010, 21:49
Сообщение
#4
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
Стандартный <algorithm>
boost.algorithm, boost.iterator, boost.range, boost.graph, boost.gil... ну там много, практически все контейнеры предоставляют итераторы и инициализируются с них... |
|
|
kwisp |
18.2.2010, 11:23
Сообщение
#5
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
к примеру, итератор может содержать указатель на следующий/предыдущий элемент, может быть интерактивным - т.е получив его один раз по идее и сохранив его, при изменении контейнера он будет хранить верное значение.
|
|
|
Iron Bug |
20.2.2010, 23:23
Сообщение
#6
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
я думаю, что "итерабельны" только упорядоченные множества: у них есть начало, конец и направление. а foreach, вообще говоря, может быть определён на любом множестве.
Сообщение отредактировал Iron Bug - 20.2.2010, 23:23 |
|
|
Tonal |
23.2.2010, 18:41
Сообщение
#7
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
Это близнецы-братья, как Партия и Ленин.
Там, где можно определить foreach можно и итератор нарисовать и наоборот. Для прочищения мозгов в этом направлении очень помогает изучение Haskell-я и Python-а |
|
|
Текстовая версия | Сейчас: 22.12.2024, 14:18 |