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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
CMson
2 / 2 / 2
Регистрация: 31.01.2013
Сообщений: 96
#1

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

10.06.2014, 19:39. Просмотров 854. Ответов 6
Метки нет (Все метки)

Подскажите, пожалуйста, что это за синтаксис цикла for? Как работает?
C
1
for (auto& team : table)
Чем он отличается от обычного цикла?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
FraidZZ
Модератор
 Аватар для FraidZZ
3892 / 1518 / 229
Регистрация: 06.01.2013
Сообщений: 4,044
Завершенные тесты: 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
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,910
Завершенные тесты: 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
:)
Эксперт С++
4384 / 3227 / 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++ цикл do while
Цикл C++
C++ Условие с двоеточием. Тернарная условная операция
C++ Конструктор с двоеточием
Цикл for C++

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

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

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