MyTetra Share
Делитесь знаниями!
Как использовать цикл for в режиме обхода элементов контейнеров (синтаксис с двоеточием ":")
Время создания: 02.08.2024 11:21
Текстовые метки: c++, си++, цикл, for, loop, foreach, range, агрегатные, объекты, контейнер, перебор, значения, элементы, двоеточие, синтаксис, auto, const
Раздел: Компьютер - Программирование - Язык C++ (Си++)
Запись: xintrea/mytetra_syncro/master/base/1722586887cpsridvuok/text.html на raw.github.com

Начиная со стандарта C++11, в языке C++ появилась возможность перебирать элементы (объекты), хранимые в контейнере. Эта возможность сильно напоминает цикл foreach, который широко используется в других, обычно скриптовых, языках программирования.



В англоязычной литературе такой тип циклов называется Range-based for loop. На русский язык данную фразу можно примерно перевести как цикл для перебора диапазона. Такое название появилось из-за того, что разработчики стандарта называют диапазоном любой набор значений, хранимый или выдаваемый объектом, к которому применяется цикл for.



Для того, чтобы отличать этот цикл от классического, был придуман синтаксис с двоеточием ":". Вот как выглядит цикл с перебором элементов массива (вектора) стандартной библиотеки:



std::vector<int> v = {0, 1, 2, 3, 4, 5};


// Получение значений элементов массива

// (тип перебираемого элемента будет int)

for (auto i : v) {

std::cout << i << ' ';

}


// Получение константных ссылок на элементы массива

// Будет напечатано то же самое что и в предыдущем примере

for (const int& i : v) {

std::cout << i << ' ';

}



Объект, хранящий перебираемые значения, может быть не только вектором или списком, но и обычным классическим массивом:



int a[] = {0, 1, 2, 3, 4, 5};

for (int i : a) {

std::cout << i << ' ';

}



В качестве типа перебираемого элемента проще всего использовать не конкретный тип, соответствующий типу хранимых значений или ссылок на эти значения (возможно, константных), а автоматически выводимый тип через ключевой слово auto:



for (int i : a) - явно заданный тип int

for (int& i : a) - явно заданный тип ссылки на int

for (const int& i : a) - явно заданный тип константной ссылки на int


for (auto i : a) - автоматически вычисленный тип int

for (auto &i : a) - автоматически вычисленный тип ссылки на int

for (const auto &i : a) - автоматически вычисленный тип константной ссылки на int



Начиная со стандарта C++20, в range base for loop появилась возможность инициализации начала работы цикла. Синтаксис выглядит следующим образом:



for ( область инициализации; перебираемый_элемент : контейнер ) {

...

}



В области инициализации можно не только инициализировать, но и создавать переменные. Созданная таким образом переменная будет существовать только в пределах цикла. Вот пример:



for (auto n = v.size(); auto i : v) {

std::cout << --n + i << ' ';

}



Строго говоря, в отличие от классического цикла for(), для range base for loop можно опускать область инициализации, не используя точку с запятой ";" - тогда цикл "range base for loop с инициализацией" превращается просто в "range base for loop". В классическом же цикле for( ; ; ) необходимо всегда использовать две точки с запятой ";".


Все возможные подробности о построении цикла for в режиме range base for loop можно найти на странице документации стандартов языка C++:



https://en.cppreference.com/w/cpp/language/range-for



Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования