Форум программистов, компьютерный форум CyberForum.ru

Цикл for с двоеточием - C++

Восстановить пароль Регистрация
 
CMson
2 / 2 / 2
Регистрация: 31.01.2013
Сообщений: 96
10.06.2014, 19:39     Цикл for с двоеточием #1
Подскажите, пожалуйста, что это за синтаксис цикла for? Как работает?
C
1
for (auto& team : table)
Чем он отличается от обычного цикла?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2014, 19:39     Цикл for с двоеточием
Посмотрите здесь:

Цикл с++ C++
Цикл for C++
Цикл с параметром и цикл с условием C++
Получить все символы,расположенные между первым и вторым двоеточием C++
C++ Изменить цикл for на цикл do-while
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
FraidZZ
Модератор
 Аватар для FraidZZ
3878 / 1504 / 227
Регистрация: 06.01.2013
Сообщений: 4,029
Завершенные тесты: 1
10.06.2014, 19:40     Цикл for с двоеточием #2
Как foreach в других языках. Добавился в стандарте C++11
CMson
2 / 2 / 2
Регистрация: 31.01.2013
Сообщений: 96
10.06.2014, 20:04  [ТС]     Цикл for с двоеточием #3
Так он работает как обычный for? Или у него есть особенность?
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
10.06.2014, 20:21     Цикл for с двоеточием #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Да, у него есть особенность. Одна из мозгоразрывающих штучек, подаренных нам C++11 (наряду с волшебными final и override), зависимость языковой конструкции от стандартной библиотеки. Эта разновидность цикла зависит от функций std::begin и std::end.
Синтаксис такой: слева идентификатор для работы с элементом контейнера, справа контейнер. auto автоматически выведет тип, но можно указать и вручную. При объявлении со знаком & (без const) можно изменять содержимое контейнера, без этого знака в идентификатор будут запихивать копии элементов.
Приведённый в примере цикл превращается вот в такое:
C++
1
2
3
4
for(auto __iter = std::begin(table); __iter != std::end(table); ++__iter){
    auto &team = *__iter;
    //...
}
CMson
2 / 2 / 2
Регистрация: 31.01.2013
Сообщений: 96
10.06.2014, 20:25  [ТС]     Цикл for с двоеточием #5
Спасибо, теперь понятней
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
10.06.2014, 21:34     Цикл for с двоеточием #6
Nick Alte, если обратиться к стандарту то конструкция разворачивается немного иначе:
6.5.4 The range-based for statement
...
In each case, a range-based for statement is equivalent to
C++
1
2
3
4
5
6
7
8
9
10
{
   auto && __range = range-init;
   for ( auto __begin = begin-expr,
              __end = end-expr;
              __begin != __end;
         ++__begin ) {
      for-range-declaration = *__begin;
      statement
   }
}
Т.е. конечное значение вычисляется однократно, а не на каждой итерации.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2014, 20:59     Цикл for с двоеточием
Еще ссылки по теме:

C++ Цикл while
C++ Условие с двоеточием. Тернарная условная операция
C++ Конструктор с двоеточием

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
11.06.2014, 20:59     Цикл for с двоеточием #7
Цитата Сообщение от Tulosba Посмотреть сообщение
если обратиться к стандарту то конструкция разворачивается немного иначе:
Это, конечно, всё хорошо и правильно, но по сути человек, для которого эта разница приобретает практическое значение, заплыл в очень опасные воды: либо меняет контейнер во время перебора элементов, либо связался с контейнером, который чересчур тяжело вычисляет end.
Yandex
Объявления
11.06.2014, 20:59     Цикл for с двоеточием
Ответ Создать тему
Опции темы

Текущее время: 00:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru