Изменение вектора в функции
В уроке «Функции» вы видели, что функция получает копию вектора. Когда она меняет копию, вектор вызывающего кода остаётся прежним. Теперь вы знаете, как это изменить: сделайте параметр ссылкой на вектор, std::vector<int>&.
#include <iostream>
#include <vector>
void addRoll(std::vector<int>& rolls, int roll) {
rolls.push_back(roll);
}
int main() {
std::vector<int> rolls = {4, 2};
addRoll(rolls, 6);
addRoll(rolls, 1);
std::cout << "Бросков: " << rolls.size() << std::endl;
return 0;
}Это выводит:
Бросков: 4Без & функция добавила бы броски в свою копию, и программа вывела бы Бросков: 2.
Через ссылку можно менять и элементы вектора. Эта функция удваивает каждое число в векторе:
void doubleAll(std::vector<int>& numbers) {
for (int i = 0; i < numbers.size(); i++) {
numbers[i] = numbers[i] * 2;
}
}Остерегайтесь цикла for по диапазону. Эта версия не меняет вектор, хотя параметр — ссылка:
void doubleAll(std::vector<int>& numbers) {
for (int number : numbers) {
number = number * 2;
}
}На каждом проходе цикла number — это копия одного элемента, как параметр, переданный по значению. Цикл удваивает копии, а вектор остаётся прежним. Программа по-прежнему компилируется и запускается без ошибок. Если вы хотите менять элементы в таком цикле, добавьте & и здесь:
void doubleAll(std::vector<int>& numbers) {
for (int& number : numbers) {
number = number * 2;
}
}Теперь на каждом проходе number — ссылка на один элемент вектора, и всё, что вы делаете с number, происходит с самим элементом. Цикл с индексом из первого примера работает не хуже.
Задание
- 1
Функция
addBonusдолжна прибавлять бонусные очки к счёту каждого игрока, но программа выводит исходные счета:12,7и15. В функции две ошибки. Сначала исправьте параметр: функция должна получать ссылку на вектор, а не его копию. Программа всё равно выведет те же числа. Почему? - 2
Исправьте и цикл в функции, чтобы он менял элементы вектора, а не их копии. Тогда программа выведет счета с бонусом, по одному в строке:
17,12и20.