У нас с коллегой только что была интересная дискуссия:
В чем разница между For
и For Each
?
В коде я уже знаю, как это работает, но как насчет бэкграунда? Что действительно рекомендуется? В каких случаях мы должны использовать один и в каких другой?
С учетом скорости, памяти и т.д.
Здесь я оставляю вам довольно интересную ссылку , но я думаю, что эту вещь можно было бы прояснить больше.
Основное отличие в большинстве языков заключается в том, что a
for
выполняет итерацию по вещам , которые не должны существовать , и предоставляет нам порядок доступа; со своей стороны,for-each
итерации по вещам, которые обязательно должны существовать . Кроме того, мы не гарантируем порядок доступа к ним.в PHP
Как вы можете видеть, будет
for
проходить диапазон значений0, 1, 2, 3, 4
, но ни одно из них не существует доfor
. Вы не просматриваете список чего-либо; значения генерируются на лету, и проверяется, соответствуют ли они условию.В этом случае содержимое массива повторяется . Эта договоренность должна уже существовать . Он не генерируется автоматически ; значения берутся из ранее существовавшего списка .
Просто немного отличается от предыдущего. Значения также берутся из уже существующего списка .
С++
Практически идентичен PHP . Значение генерируется автоматически и проверяется, соответствует ли оно определенному условию. Это значение не должно существовать за пределами
for
.Контейнер проходится от его первого элемента до последнего.
Ну, в случае с C++ дело обстоит иначе . Вызывается определенная функция объекта, и результирующий объект обновляется до тех пор, пока выполняется определенное условие. Поскольку задействованные функции генерируются пользователями... ну, мы действительно понятия не имеем, существовали ли значения до
for
. Его можно считать крайним случаем поливалентности.Однако эта форма была введена, чтобы упростить использование контейнеров; Итак, в своей первоначальной концепции мы можем сделать вывод, что, как и PHP , он перебирает список элементов , которые существовали до
for
.Тенденции
Кажется, что тенденция идет к
for-each
языковой форме C++; делать вызовы вспомогательных функций, которые действительно предоставляют нам реальное значение для обработки.Такой способ работы очень универсален , но предполагает определенные дополнительные затраты (как правило, особенно в некомпилируемых языках, вызов функции обходится дороже , чем вызов оператора, предусмотренного языком).
Эффективность при использовании с контейнерами
Если вы хотите перебрать данные в контейнере на некомпилируемых языках, файл
for-each
.Это уже не по теме, но грубо говоря , в интерпретируемых языках объекты или словари или как они там называются обычно реализуются через деревья или через хеш- таблицы (реже).
Будучи реализованным с использованием деревьев, доступ от одного узла к другому относительно прост ; достаточно просто получить доступ к указателю , что немного меньше, чем немедленно (форма
for-each
не гарантирует порядок, в котором будут посещены различные значения).Однако доступ к элементу
Contenedor[5]
влечет за собой обход дерева от его корня, сравнение ключей до тех пор, пока не будет найден искомый. Гораздо медленнее, чем в предыдущем случае.Заготовка "дедушка луковица", примечание:
У каждого языка есть свой вариант, но, если вернуться к исходной концепции, цикл for был циклом с определенным количеством (до запуска) итераций:
Если вы заранее не знали количество итераций, вам приходилось использовать цикл while:
Это настолько предполагалось, что в таких языках, как Паскаль или Модула-2, условие было задано в начале и было неизменным. Например, следующий код:
Он не создавал бесконечный цикл, а вместо этого выполнялся 5 раз, хотя после последней итерации n было равно 10, потому что условие проверялось по значению n в начале цикла.
Но затем появился C и создал "ублюдок" for, микширующий for и while:
Синтаксис этого for даже не заставляет вас использовать счетчик или иметь код в теле цикла:
Итак, мы имеем, что сегодня нет разницы между while и for.
Цикл forEach — это почти возврат к истокам: пока вы не используете a
break
, количество итераций — это количество элементов в коллекции, которую вы просматриваете. Но этот цикл обеспечивает более простой синтаксис, функциональность даже меньше, чем у «классического» цикла for, поскольку мы не знаем индекс элемента и, следовательно, не можем сделать что-то столь же простое, как удалить или заменить его. с еще одним в коллекции, которую мы гастролируем Пример Java:В более функциональных языках, таких как javascript или Java 8, они дали еще один поворот в пользу параллелизма, и у нас есть функция, скрывающая цикл:
и что его тоже нельзя остановить, поэтому были созданы другие функции, такие как некоторые, фильтрация, поиск ..., которые не требуют просмотра всей коллекции.
Конец заготовки. Теперь я отвечаю на вопрос, какой из них использовать?:
Используйте тот, который лучше всего соответствует вашим потребностям: цикл forEach имеет более понятный синтаксис, не требует объявления индекса, и в большинстве случаев компилятор преобразует его в классический цикл for (в Java с использованием итератора, например), поэтому производительность будет очень похожей.
Я думаю, что в зависимости от необходимости вы будете использовать тот или иной.
for-each
более удобен в том, что касается синтаксиса, и его чтение простое и ясное. Что такое преимуществоfor
гораздо более неоднозначен в этом смысле и добавляет немного больше сложности, и вы, скорее всего, ошибетесь в каком-то параметре.Все это относительно стиля, но различий в производительности ( сзади ) я понимаю, что их практически мало, если не вообще нет , в глазах пользователя.
Другое дело знать, о каком языке идет речь, так как Javascript в C++ проходит через C#