Функции и векторы
Аргументом может быть любое значение, в том числе вектор. Тогда у параметра векторный тип, например std::vector<int> numbers. Функция, получившая вектор, может пройти по нему циклом и вернуть результат. Эта функция считает, сколько чисел в векторе больше заданного предела:
#include <iostream>
#include <vector>
int countAbove(std::vector<int> numbers, int limit) {
int count = 0;
for (int number : numbers) {
if (number > limit) {
count++;
}
}
return count;
}
int main() {
std::vector<int> temperatures = {18, 25, 31, 22, 28};
std::vector<int> points = {5, 10, 15};
std::cout << countAbove(temperatures, 24) << std::endl;
std::cout << countAbove(points, 7) << std::endl;
return 0;
}Эта программа выводит:
3
2Параметр numbers хранит вектор, который передал вызов: сначала temperatures, потом points. Подсчёт вы знаете из урока о циклах, но теперь он находится внутри функции, поэтому его можно выполнить для любого вектора одним вызовом. А поскольку count — локальная переменная, каждый вызов снова начинается с 0.
Обратите внимание, где стоит return: после }, которой заканчивается цикл, когда все числа проверены. Частая ошибка — поставить его на строку выше, внутрь цикла:
for (int number : numbers) {
if (number > limit) {
count++;
}
return count;
}Теперь return находится в теле цикла. Он завершает всю функцию, а значит, и цикл, уже на самом первом проходе. Функция проверяет только первое число, 18, и для temperatures возвращает 0.
Функция может возвращать и вектор. Тогда тип возвращаемого значения, например, std::vector<int>. Создайте пустой вектор перед циклом, добавляйте в него элементы через push_back() в цикле и верните его после цикла.
Но есть одна тонкость: параметр получает копию вектора, как и числа в предыдущем упражнении. Когда функция изменяет вектор в своём параметре, она меняет только свою копию, а вектор в main остаётся прежним:
#include <iostream>
#include <vector>
void addBonus(std::vector<int> points) {
points.push_back(10);
std::cout << "В функции элементов: " << points.size() << std::endl;
}
int main() {
std::vector<int> points = {5, 8, 7};
addBonus(points);
std::cout << "В main элементов: " << points.size() << std::endl;
return 0;
}Эта программа выводит:
В функции элементов: 4
В main элементов: 3Функция добавила элемент в свою копию, а не в вектор points в main. Поэтому, если вы хотите, чтобы функция изменила вектор, пока что верните вектор из функции и сохраните его в main. К тому же копирование большого вектора занимает время. В следующем уроке, «Ссылки и указатели», вы узнаете, как передать в функцию переменную из main напрямую, без копирования, чтобы функция могла её изменить.
Задание
- 1
Программа не компилируется, потому что функции
averageещё нет. Напишите её на месте комментария: у неё параметрnumbersтипаstd::vector<int>, а возвращает она среднее чисел вектора какdouble, то есть их сумму, делённую на количество. Остерегайтесь целочисленного деления: храните сумму в переменной типаdouble. Тогда программа выведет средние температуры двух недель,20.8и12.75. - 2
Под функцией
averageнапишите функциюwarmDaysс двумя параметрами:temperaturesтипаstd::vector<int>иlimitтипаint. Она возвращает новый вектор из температур, которые вышеlimit. В концеmain, передreturn 0;, сохранитеwarmDays(week1, 20)в переменнуюwarmи циклом выведите каждую её температуру на отдельной строке. Программа выведет21,24и22.