Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.72/64: Рейтинг темы: голосов - 64, средняя оценка - 4.72
WLF
1 / 1 / 0
Регистрация: 06.12.2013
Сообщений: 105
1

Как это работает? (range-based for loop)

27.08.2018, 21:43. Просмотров 12169. Ответов 14
Метки нет (Все метки)


Объясните, пожалуйста, эту конструкцию:
C++
1
2
3
4
char buf[4] = { 'a', 'b', 'c', 'd' };
for (auto it : buf) {
  std::cout << it;
}
А конкретно - "auto it : buf".
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.08.2018, 21:43
Ответы с готовыми решениями:

range-based for не работает
#include &lt;iostream&gt; #include &lt;vector&gt; int main() { std::vector&lt;int&gt; v(30); for (auto z : v)...

Как определить индекс элемента в range-based for цикле?
Вопрос, вот есть у меня простейший Range-based цикл int arr = { 9, 7, 1 }; for (auto i: arr)...

Range-based for
Пример кода: int my_array = {1, 2, 3, 4, 5}; for(int &amp;x : my_array) { x *= 2; } Возникли...

Range-based for
Почему не работает данный цикл с динамически выделенным массивом? Подозреваю, что из-за...

14
Заблокирован
27.08.2018, 21:46 2
Range-based for loop.
0
1110 / 844 / 389
Регистрация: 30.10.2017
Сообщений: 2,366
27.08.2018, 21:53 3
Лучший ответ Сообщение было отмечено WLF как решение

Решение

Цитата Сообщение от WLF Посмотреть сообщение
Объясните, пожалуйста, эту конструкцию
Создается локальная (auto) переменная it c типом char (тип элемента массива), в которую при прохождении цикла поочередно записывается каждое значение массива buf. Это новая форма записи циклов for (C++11).
1
Заблокирован
27.08.2018, 21:54 4
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Создается локальная (auto)
С такой формулировкой может показаться, что auto отвечает за локальность переменной
1
1110 / 844 / 389
Регистрация: 30.10.2017
Сообщений: 2,366
27.08.2018, 21:57 5
mizannny, да, вы правы. auto тут используется по другому.

Ключевое слово auto указывает компилятору использовать выражение инициализации объявленной переменной, или параметр лямбда-выражения, чтобы вывести ее тип.
https://msdn.microsoft.com/ru-... 93667.aspx
0
WLF
1 / 1 / 0
Регистрация: 06.12.2013
Сообщений: 105
27.08.2018, 22:06  [ТС] 6
Не, я понял, что auto это автоматический тип.
Т.е. при такой записи it не выйдет за пределы массива?
0
1110 / 844 / 389
Регистрация: 30.10.2017
Сообщений: 2,366
27.08.2018, 22:08 7
Цитата Сообщение от WLF Посмотреть сообщение
при такой записи it не выйдет за пределы массива?
Не выйдет. В вашем случае цикл пройдет 4 раза.
0
Велосипедист...
349 / 216 / 73
Регистрация: 15.12.2015
Сообщений: 785
27.08.2018, 23:24 8
Насколько я помню, the range-based for statement ( данная форма записи конструкции for ) работает с :
– массивами, которые построены на основе фундаментальных типов ;
– классами контейнеров, для которых определены функции-члены ( методы ) .begin() и .end() ;
– всего остального, к чему можно применить std::begin() и std::end().

Добавлено через 2 минуты
Что значит команда for (auto c:string)?
0
Эксперт CЭксперт С++
5053 / 2237 / 330
Регистрация: 20.02.2013
Сообщений: 5,600
Записей в блоге: 24
28.08.2018, 06:33 9
Цитата Сообщение от WLF Посмотреть сообщение
C++
1
2
3
for (auto it : buf) {
  std::cout << it;
}
WLF, читайте этот код примерно так:
Для каждого элемента (назовём его, скажем, it) последовательности по имени buf, выполнить инструкцию std::cout << it;, а тип элемента пусть выведет компилятор самостоятельно (auto), ведь выше мы уже указывали что buf - это массив чаров, значит где-то в своих недрах компилятор это помнит - вот пусть и вспомнит.
Это, как уже упоминали выше, называется цикл for, основанный на диапазоне (range-based for loop).
0
sourcerer
28.08.2018, 06:37
  #10
 Комментарий модератора 
WLF, пожалуйста, прочитайте правила форума.
Особое внимание обратите на пункт 4.3 (порядок именования тем).
0
Модератор
1212 / 648 / 121
Регистрация: 23.07.2018
Сообщений: 2,100
Записей в блоге: 3
28.08.2018, 08:43 11
C++
1
2
    for ( auto a : { 'a', 'b', 'c', 'd', } )
        std::cout << a;
тоже должно сработать.

for (auto it : buf) { std::cout << it; }
работает приблизительно так:
C++
1
2
3
4
5
for ( auto p = std::begin(buf); p != std::end(buf); ++p )
{
    auto it = *p;
    { std::cout << it; }
}
0
Эксперт С++
1589 / 921 / 777
Регистрация: 06.02.2016
Сообщений: 2,408
Записей в блоге: 29
28.08.2018, 10:08 12
Цитата Сообщение от mizannny Посмотреть сообщение
С такой формулировкой может показаться, что auto отвечает за локальность переменной
В Си так и есть. Auto указывает на то, что переменная автоматическая (с локальной областью видимости). В С++ смысл изменился (про него уже рассказали выше)
0
Любитель чаепитий
3535 / 1646 / 507
Регистрация: 24.08.2014
Сообщений: 5,600
Записей в блоге: 1
28.08.2018, 10:28 13
Цитата Сообщение от Peoples Посмотреть сообщение
В С++ смысл изменился
в с++11.
Цитата Сообщение от politoto Посмотреть сообщение
работает приблизительно так

там std::end(buf) вызывается только 1 раз.
0
"C with Classes"
1621 / 1244 / 474
Регистрация: 16.08.2014
Сообщений: 5,219
Записей в блоге: 1
28.08.2018, 10:32 14
WLF,
Оператор for на основе диапазонов используется для создания циклов, которые должны выполняться по диапазону значений, т. е. любому набору значений, по которому возможны итерации, например std::vector или любая другая последовательность библиотеки STL, диапазон которой определен методами begin() и end(). Имя, объявленном в части for-range-declaration, является локальным для оператора for и не может быть объявлено в выражении (expression) или операторе (statement). Обратите внимание, что в части for-range-declaration этого оператора предпочтение отдано ключевому слову auto.
0
Заблокирован
28.08.2018, 10:39 15
Цитата Сообщение от Peoples Посмотреть сообщение
В Си так и есть.
Я в курсе как в Си. О том, что нужно это исправить, я уже написал во втором своем сообщении. Фраза:
Цитата Сообщение от mizannny Посмотреть сообщение
С такой формулировкой может показаться, что auto отвечает за локальность переменной
означает: "auto не отвечает за локальность переменной". Если ты не понял
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2018, 10:39

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Range-based for
Дана конструкция вида for(auto a:some_func()). Гарантирует ли стандарт что some_func будет вызвано...

A range-based for statement
я вот чё то не понимаю - когда вызываем оператор delete для указателя на массив, он каким то...

загадки range-based
если поставить auto &amp;it - будет тоже самое - почему?// initializer_list::begin/end #include...

Range-based for trouble
Доброго времени суток, уважаемые форумчане! У меня возникла небольшая проблема с данной штукой....


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.