Перебор вектора
Циклы и векторы неразделимы. Цикл for может пройти по индексам вектора от 0 до последнего и прочитать каждый элемент:
std::vector<std::string> games = {"Футбол", "Теннис", "Гольф"};
for (int i = 0; i < games.size(); i++) {
std::cout << games[i] << std::endl;
}Он выводит:
Футбол
Теннис
ГольфПеременная i принимает значения 0, 1 и 2, а games[i] — это элемент с таким индексом. В условии стоит <, а не <=. В векторе 3 элемента, поэтому его последний индекс — games.size() - 1, то есть 2. С <= цикл прочитал бы и games[3], элемент, которого нет, и программа вывела бы мусор или упала. Если же написать games.at(i) вместо games[i], она остановилась бы с ошибкой.
Перебирать все элементы приходится так часто, что в C++ есть более короткая запись, цикл for по диапазону (по-английски range-based for):
std::vector<std::string> games = {"Футбол", "Теннис", "Гольф"};
for (std::string game : games) {
std::cout << game << std::endl;
}Футбол
Теннис
ГольфЧитайте это как «для каждого game из games». На каждой итерации переменная game хранит следующий элемент: сначала "Футбол", затем "Теннис" и потом "Гольф". После последнего элемента цикл заканчивается. Индекс и size() вообще не нужны, так что и ошибиться в них нельзя.
Перед двоеточием вы создаёте переменную для элементов. Её тип должен совпадать с типом элементов: std::string для std::vector<std::string>, int для std::vector<int>. Если указать неверный тип, например for (int game : games), Clang сообщит error: no viable conversion from 'std::string' to 'int'. Имя — на ваш вкус. Хорошая привычка — называть переменную по одному элементу: game в games, price в prices.
Какой цикл выбрать? Цикл for по диапазону, когда нужен просто каждый элемент. Цикл с индексом, когда нужен сам индекс, например чтобы пронумеровать элементы, или когда вы хотите изменять элементы. В цикле по диапазону переменная хранит копию элемента, поэтому её изменение не меняет вектор. А через индекс вы меняете сам элемент:
std::vector<int> numbers = {1, 2, 3};
for (int i = 0; i < numbers.size(); i++) {
numbers[i] = numbers[i] * 10;
}
for (int number : numbers) {
std::cout << number << std::endl;
}10
20
30Задание
- 1
Под строкой, которая выводит число игроков команды, напишите цикл
forпо диапазону для вектораteammates. - 2
В цикле выведите каждого игрока в отдельной строке:
Андрей,Тимур,ИваниПавел. - 3
Под ним напишите цикл с индексом, который выводит игроков с их номерами:
1. Андрей,2. Тимур,3. Ивани4. Павел, каждого в своей строке. Номер на единицу больше индекса, то естьi + 1.