Основанное на диапазоне выражение for (C++)
Циклически и последовательно выполняет оператор (statement
) каждого элемента в выражении (expression
).
Синтаксис
for (
for-range-declaration:
Выражение)
инструкция
Комментарии
Используйте оператор на основе for
диапазона для создания циклов, которые должны выполняться через диапазон, который определяется как любой, через который можно выполнить итерацию( например, std::vector
или любую другую последовательность стандартной библиотеки C++, диапазон которой определяется begin()
и end()
. Имя, объявленное в for-range-declaration
части, является локальным для инструкции for
и не может быть повторно объявлено в expression
или statement
. Обратите внимание, что ключевое auto
слово предпочтительно в for-range-declaration
части инструкции.
Новые возможности в Visual Studio 2017: циклы на основе for
диапазона больше не требуют этого begin()
и end()
возвращают объекты одного типа. Это позволяет end()
возвращать объект sentinel, например используемый диапазонами, как определено в предложении Ranges-V3. Дополнительные сведения см. в разделе "Обобщение Range-Based LoopFor
" и библиотеки range-v3 в GitHub.
В этом коде показано, как использовать циклы на основе for
диапазона для итерации по массиву и вектору:
// range-based-for.cpp
// compile by using: cl /EHsc /nologo /W4
#include <iostream>
#include <vector>
using namespace std;
int main()
{
// Basic 10-element integer array.
int x[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// Range-based for loop to iterate through the array.
for( int y : x ) { // Access by value using a copy declared as a specific type.
// Not preferred.
cout << y << " ";
}
cout << endl;
// The auto keyword causes type inference to be used. Preferred.
for( auto y : x ) { // Copy of 'x', almost always undesirable
cout << y << " ";
}
cout << endl;
for( auto &y : x ) { // Type inference by reference.
// Observes and/or modifies in-place. Preferred when modify is needed.
cout << y << " ";
}
cout << endl;
for( const auto &y : x ) { // Type inference by const reference.
// Observes in-place. Preferred when no modify is needed.
cout << y << " ";
}
cout << endl;
cout << "end of integer array test" << endl;
cout << endl;
// Create a vector object that contains 10 elements.
vector<double> v;
for (int i = 0; i < 10; ++i) {
v.push_back(i + 0.14159);
}
// Range-based for loop to iterate through the vector, observing in-place.
for( const auto &j : v ) {
cout << j << " ";
}
cout << endl;
cout << "end of vector test" << endl;
}
Результат выглядит так:
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
end of integer array test
0.14159 1.14159 2.14159 3.14159 4.14159 5.14159 6.14159 7.14159 8.14159 9.14159
end of vector test
Цикл на основе for
диапазона завершается, когда выполняется один из них statement
: a break
, return
или goto
к помеченной инструкции за пределами цикла на основе for
диапазона. Оператор continue
в цикле на основе for
диапазона завершает только текущую итерацию.
Имейте в виду следующие факты о диапазоне:for
Такие циклы автоматически распознают массивы.
Такие циклы автоматически распознают контейнеры с методами
.begin()
и.end()
.Для всех остальных итераторов в них используются поиск, зависящий от аргументов (
begin()
иend()
).
См. также раздел
auto
Операторы итерации
Ключевые слова
Оператор while
(C++)
Оператор do-while
(C++)
Оператор for
(C++)