Разница между Foreach и For Loops? - PullRequest
3 голосов
/ 14 ноября 2011

В чем реальная разница между циклами foreach и for, если любой из них может выполнить ту же работу?Я изучаю C ++ и, очевидно, нет цикла foreach для его массивов: (

Ответы [ 6 ]

5 голосов
/ 14 ноября 2011

В C ++ нет языковой конструкции "foreach", по крайней мере, в буквальном смысле. C ++ 11 вводит что-то, что «так же хорошо, как» цикл foreach, хотя.

Традиционный цикл for имеет отношение к оценке условий и выполнению повторных операций. Это очень общая структура управления. Его наиболее популярное использование - перебор содержимого контейнера или массива, но это лишь малая часть того, что вы можете с ним сделать.

С другой стороны, цикл "foreach" явно предназначен для итерации по элементам контейнера.

Пример:

int arr[5] = { 1, 3, 5, 2, 4 };

for (int & n : arr) { n *= 2; } // "for-each" loop, new in C++11

for (size_t i = 0; i != 5; ++i) { arr[i] *= 2; } // "classic" for loop

Во втором для мы используем традиционный цикл for для увеличения вспомогательной переменной i для доступа к контейнеру arr. Первый цикл на основе диапазона *1014* не раскрывает никаких деталей итерации, а просто говорит: «Делайте то и это с каждым элементом в коллекции».

Поскольку традиционный цикл for является очень общей структурой управления, его также можно использовать необычными способами:

std::vector<std::string> all_lines;
for (std::string line; std::cin >> line; all_lines.push_back(line))
{
  std::cout << "On line " << (all_lines.size() + 1) << " you said: " << line << std::endl;
}

Вы можете тривиально переписать for(A; B; C) как цикл while:

{  // scope!
  A;
  while (true && B)
  {
    {  // more scope!
      /* for loop body */
    }
    C;
  }
}

Редактировать: Вероятно, было бы упущением не упомянуть шаблон библиотечной функции std::for_each из <algorithm>, который в сочетании с лямбдами очень приятный и информативный способ перебора произвольных диапазонов (а не только целых контейнеров ). Он существует с 1-го дня, но до лямбды это была ужасная боль в использовании.


Обновление: Я подумал о чем-то еще, что может быть уместно здесь: цикл "foreach" обычно предполагает, что вы не модифицируете контейнер. Обычный тип зацикливания, который модифицирует контейнер, требует традиционного for -loop; как, например, в этом типичном erase шаблоне:

for(Container::const_iterator it = v.begin(); it != v.end() /* not hoisted! */; /* no increment */ )
{
  // do something
  if (suitable_condition)
  {
    v.erase(it++);   // or it = v.erase(it), depending on container type
  }
  else
  {
    ++it;
  }
}
1 голос
/ 14 ноября 2011

Существует что-то вроде каждого для массивов в C ++, и это iterators . Оба цикла по существу идентичны, с той лишь разницей, что с обычным циклом for у вас есть индекс, который вам может понадобиться в зависимости от того, к какому типу данных вы обращаетесь, и нужно ли делать какие-то вычисления с индексом, и он есть (вероятно) повышенная вероятность появления ошибок типа «один на один». Принимая во внимание, что циклы foreach просто гарантируют, что они будут выполняться столько раз, сколько элементов в массиве, без предоставления индекса (который вы можете имитировать), поэтому, как я уже сказал, они по сути одинаковы, но их использование во многом зависит от того, как вы манипулируете данные.

1 голос
/ 14 ноября 2011

foreach обычно имеет 1 параметр, for имеет 3. Все, что foreach может сделать, for может тоже.Одна из причин, по которой foreach не существует в C ++, заключается в том, что количество итераций не всегда можно определить по типу.

Я полагаю, что в библиотеке boost есть способ заставить foreach работать, а в C ++ 11 диапазон for:

int my_array[5] = {1, 2, 3, 4, 5};
for (int &x : my_array) {
    x *= 2;
}
0 голосов
/ 14 ноября 2011

Как показывает опыт, FOR быстрее, чем FOREACH

0 голосов
/ 14 ноября 2011

В других языках с конструкцией foreach они обычно удобнее, поскольку не нужно индексировать коллекцию, над которой вы работаете.Таким образом, вы получаете следующий объект в коллекции без доступа (или необходимости) к самому индексу.Если по какой-то причине вам нужен индекс, вам обычно нужен цикл for, хотя в некоторых языках у вас есть доступ к счетчику в их 'foreach'.

0 голосов
/ 14 ноября 2011

Синтаксис «Для каждого» используется для перебора коллекции объектов, в то время как цикл for - это цикл, который будет выполняться для заданного диапазона. C ++ имеет for_each в своем STL и может быть использован для перебора контейнеров линейных объектов, таких как вектор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...