Индекс за пределами вектора
Что произойдёт, если запросить индекс, по которому нет элемента? Например, индекс 3 в векторе из трёх элементов:
std::vector<int> numbers = {10, 20, 30};
std::cout << numbers[3] << std::endl;Программа выведет какое-нибудь бессмысленное число, например:
44225Квадратные скобки не проверяют, принадлежит ли индекс вектору. Программа просто читает то, что лежит в памяти после конца вектора, как при выводе переменной, которой вы не задали начальное значение. При следующем запуске число может быть другим, а если индекс далеко за концом, программа может даже аварийно завершиться. Ничто не предупреждает об ошибке, и поэтому её трудно найти. Отрицательные индексы, которые вы, возможно, знаете из других языков, в C++ тоже не работают: numbers[-1] тоже находится за пределами вектора.
Надёжнее метод at(). numbers.at(1) делает то же, что и numbers[1], но сначала проверяет индекс. Если индекс за пределами вектора, программа останавливается с ошибкой:
std::vector<int> numbers = {10, 20, 30};
std::cout << numbers.at(1) << std::endl;
std::cout << numbers.at(3) << std::endl;
std::cout << "Конец" << std::endl;Программа выведет 20 и остановится. Текст Конец не выводится никогда. Вместо него в выводе появляется красное сообщение об ошибке, в котором есть out_of_range. Вы сразу понимаете, что индекс неверный, а по последней выведенной строке видно, где программа остановилась.
Менять элемент можно и с помощью at(), как и с квадратными скобками: numbers.at(0) = 15;
Квадратные скобки короче, и в программах вы будете видеть их чаще. Когда вы не уверены в индексе, используйте at(). Но лучшая защита — правильно вычислять индексы: у первого элемента индекс 0, а у последнего — size() - 1.
Задание
- 1
Программа должна выводить температуру в понедельник, первый день недели, и в воскресенье, последний день. Запустите её: обе температуры неверны. Сначала исправьте индекс для понедельника, чтобы в выводе была строка
Понедельник: 18. - 2
Для воскресенья замените
temperatures[7]наtemperatures.at(7)и запустите программу. Она остановится с ошибкой, потому что индекс 7 за пределами вектора. Затем исправьте индекс вat(): воскресенье — последний элемент, поэтому его индексtemperatures.size() - 1. Тогда программа выведетВоскресенье: 20.