Пространства имён
Варианты
Действия

Range-based for loop (начиная с C++11)

Материал из cppreference.com
< cpp‎ | language

 
 
Язык С++
Общие темы
Управление программой
Операторы условного выполнения
Операторы повторения
цикл for
цикл for по интервалу (C++11)
Операторы перехода
Функции
объявление функции
объявление лямбда-функции
шаблон функции
спецификатор inline
спецификаторы исключений (устарело)
спецификатор noexcept (C++11)
Исключения
Пространства имён
объявление пространства имён
псевдонимы пространства имён
Типы
спецификатор decltype (C++11)
Спецификаторы
cv-спецификаторы
спецификаторы продолжительности хранения
спецификатор constexpr (C++11)
спецификатор auto (C++11)
спецификатор alignas (C++11)
Инициализация
Литералы
Выражения
Утилиты
Типы
typedef-объявление
объявление псевдонима типа (C++11)
атрибуты (C++11)
Приведения типов
неявные преобразования
const_cast-преобразование
static_cast-преобразование
dynamic_cast-преобразование
reinterpret_cast-преобразование
C-подобное и функциональное приведение типов
Выделение памяти
Классы
Особые свойства классовых функций
Специальные функции-члены
Шаблоны
шаблон класса
шаблон функции
специализация шаблона
упакованные параметры (C++11)
Разное
Ассемблерные вставки
 
Выполняет цикл в диапазоне.
Оригинал:
Executes a for loop over a range.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
в диапазоне значений, например, из некоторых контейнеров или списка.
Оригинал:
Used as a more readable equivalent to the traditional
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

Содержание

[править] Синтаксис

for ( range_declaration : range_expression) loop_statement

[править] Объяснение

Приведенный выше синтаксис производит код, похожий на следующий (__range, __begin и __end предназначены для экспозиции только)
Оригинал:
The above syntax produces code similar to the following (__range, __begin and __end are for exposition only):
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
{
auto && __range = range_expression ;
auto __begin = begin_expr(__range);
auto __end = end_expr(__range);
for (;__begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}

}

range_expression оцениваются, чтобы определить последовательность или диапазон будет перемещаться. Каждый элемент последовательности разыменовывается, и присваивается переменной, используя тип и название, данное в range_declaration.
Оригинал:
The range_expression is evaluated to determine the sequence or range will be iterated over. Each element of the sequence is dereferenced, and assigned to the variable using the type and name given in the range_declaration.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
begin_expr и end_expr определены как либо:
Оригинал:
The begin_expr and end_expr are defined to be either:
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • (__range) и (__range + __bound) для типов массивов, где __bound это массив связаны
    Оригинал:
    (__range) and (__range + __bound) for array types, where __bound is the array bound
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • begin(__range) и end(__range), которые находятся на основе аргументов поиска правил. Для стандартных контейнеров этом заканчивает тем, что эквивалентно std::begin и std::end, который в свою очередь, требует __range.begin() и __range.end().
    Оригинал:
    begin(__range) and end(__range), which are found based on argument-lookup rules. For standard containers this ends up being equivalent to std::begin and std::end which in turn calls __range.begin() and __range.end().
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
Если range_expression возвращает временный, срок службы продлен до конца цикла, как указано путем связывания с ссылкой RValue __range.
Оригинал:
If range_expression returns a temporary, its lifetime is extended until the end of the loop, as indicated by binding to the rvalue reference __range.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
может быть использована для выхода из цикла ранних и
продолжить выступление
Оригинал:
continue statement
Текст был переведён автоматически через [http://translate.google.com Google Translate].
Вы можете проверить и исправить перевод. Для инструкций кликните [http://en.cppreference.com/w/Cppreference:MachineTranslations сюда].
может быть использована для перезапуска цикла к следующему элементу.

[править] Ключевые слова

for

[править] Пример

#include <iostream>
#include <vector>
 
int main()
{
    std::vector<int> v = {0, 1, 2, 3, 4, 5};
 
    for (int &i : v) // access by reference (const allowed)
        std::cout << i << ' ';
 
    std::cout << '\n';
 
    for (auto i : v) // compiler uses type inference to determine the right type
        std::cout << i << ' ';
 
    std::cout << '\n';
 
    for (int i : v) // access by value as well
        std::cout << i << ' ';
 
    std::cout << '\n';
}

Вывод:

0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5