[БЕЗ_ЗВУКА] Еще один пример использования вектора. В данном случае у нас мы заранее не знали, во-первых, размер вектора, и мы его считывали с входного потока, во-вторых, мы не знали, какие в нем будут элементы. Бывают случаи, когда я заранее знаю содержимое вектора. Например, у меня будет вектор, который для каждого месяца в году, которых у нас 12 штук, будет хранить количество дней в этих месяцах. Как я это проверну? Я создам вектор целых чисел, потому что количество дней — это целое число. Назову его как-нибудь, days_in_months. И конечно я заранее знаю, сколько у меня дней в каждом месяце. Как я создам такой вектор? С помощью фигурных скобок. Я пишу: тип (вектор от int), затем название переменной и после знака = — фигурные скобки, в которых я и укажу содержимое моего вектора. Давайте я ограничусь первыми месяцами: январь, февраль, март, апрель, май. Конечно, здесь можно указать и 12 элементов вместо 5. Такой вектор опять же можно распечатать, если только поправить функцию PrintVector так, чтобы она принимала вектор чисел вместо вектора строк. Давайте я вот здесь вот буду принимать вектор чисел, а вот здесь напишу auto, чтобы у меня переменная s могла иметь любой тип. Итак, я компилирую программу, запускаю и вижу, что у меня действительно вывелся мой вектор, те самые числа: 31, 28, 31, 30 и 31. Итак, это еще один способ создания вектора. Заметим, на самом деле, что мы немножко покривили душой, когда указали количество дней в феврале, как 28. Все-таки в високосных годах количество дней в феврале — 29. И иногда может захотеться этот элемент вектора поправить. Как это будет выглядеть? Очень просто. Мы напишем if, у нас есть какое-то значение текущего года, мы как-то можем проверить его на високосность, я в своем случае напишу просто if (true), чтобы не заморачиваться с именно проверкой на високосность. Если мой год оказался високосным, давайте я все-таки комментарий напишу, если год високосный, в этом случае что мне надо сделать? Мне нужно добавить лишний день в февраль. Февраль — это второй месяц, однако у нас, как и во многих других языках программирования, индексы вектора нумеруются с 0. Поэтому февраль, хоть и второй месяц, но количество его дней лежит в первом элементе. Поэтому я обращаюсь к первому элементу вектора и делаю ++. Давайте посмотрим, чему теперь равен наш вектор. Компилируем, запускаем, видим, что в феврале 29 дней. Итак, даже если я создал вектор с конкретными значениями конкретной длины, я могу после этого вектор менять. Как менять конкретные элементы, так и делать в этот вектор push_back, например. В чем отличие вот такого вектора от вектора со строчками в первом примере? В том, что в первом примере у нас был просто набор элементов. Нам в принципе не был важен их порядок, у нас не было такого условия в постановке задачи. Здесь же у нас элементы вектора привязаны к их позициям в векторе, а именно, у нас имеет значение, что в первом элементе вектора лежит не просто какое-то абстрактное число 28, а именно количество дней в первом месяце при нумерации с нуля. То есть вектор можно использовать, чтобы хранить не просто наборы элементов, а элементы в привязке к их индексам, к их ключам. Давайте рассмотрим еще один похожий пример. Скажем, я сохраню для каждого дня в месяце, является ли он выходным или праздничным. Я использую вектор булевских значений. Ну скажем, is_holiday. Вот такой вот вектор. Допустим, я сначала захочу сохранить туда значения для февраля, в феврале 28 дней, поэтому вектор будет иметь размер 28. Более того, поскольку у меня большинство дней выходными не являются, я по умолчанию заполню этот вектор значением false. Заметьте, когда у меня были строчки, и я создавал вектор конкретной длины, я не указывал значения по умолчанию. По умолчанию там были пустые строки. Здесь все-таки я хочу явно указать, что там должны быть значения false. По умолчанию дни не праздничные. И теперь я могу как-нибудь этот вектор заполнять. Например, я точно знаю, что 23 февраля в России — выходной день. Опять же, я чуть не попался. 23 февраля в нумерации с 1. Элементы вектора нумеруются с нуля, поэтому у меня будет элемент номер 22. Такой вектор, конечно, все еще можно вывести с помощью функции PrintVector, если опять же немного ее поправить, чтобы она работала не только с векторами чисел, но и с векторами булевских значений. Заметьте, мне постоянно приходится исправлять мою функцию: у меня не получилось написать универсальную функцию, которая распечатывала бы любой вектор. Это мы обсудим позже в нашей специализации. Пока что у меня будет функция, которая работает только с векторами конкретных значений. Этот вектор я тоже могу вывести, если скомпилирую код и запущу его. Итак, у меня сплошные нули, кроме одной позиции, 23. Чудесно. Что теперь будет, если я захочу использовать этот вектор для хранения праздников мартовских? Если я не захочу по какой-то причине создавать новый вектор, захочу использовать этот вектор. В марте все-таки не 28 дней и даже не 29, а 31. Поэтому вектор нужно расширить. Как же расширить вектор? Вы можете, изучив документацию, узнать про метод resize и попробовать его здесь использовать. Давайте попробуем вызвать метод resize от вектора и укажем новый размер этого вектора. Действительно размер вектора изменится. Но каким же будет его содержимое? Давайте посмотрим. Поскольку у меня уже довольно много элементов в векторе, давайте вместе со значениями я буду выводить еще и индексы. Скажем, через двоеточие. Компилирую код. Что-то пошло не так. Нет переменной i. Хорошо, заведем переменную i, будем увеличивать ее на единицу на каждом шаге. i — это текущий индекс. Теперь код компилируется, запускаем его. Что же мы видим? Мы видим, что в векторе нули везде, кроме опять же того самого 22-го элемента. То есть resize сделал не то, что нам нужно. Он оставил нетронутой исходную часть вектора. Если же мы хотим переиспользовать этот вектор и сделать его длины 31, нам поможет другой метод. Метод называется assign. Вот с помощью такой записи я сделаю мой вектор размера 31 и проинициализирую его значениями типа false. Теперь я могу сюда записать знание про 8-е марта, день номер 7 в нумерации с нуля праздничный, и, запустив код, увидеть, что у меня нет никакого упоминания про праздничность 23 марта. Действительно у меня вот здесь вот ноль. Кроме того, стоит сказать про еще один метод. Если вам нужно очистить вектор, вы могли бы написать .assign(0) или .resize(0), но код будет понятнее, если вы напишете просто is_holiday.clear(); Просто метод для очистки вашего вектора. Итак, вектор можно использовать, во-первых, для хранения набора значений, и это самый частый кейс использования вектора, во-вторых, для хранения значений в привязке к их индексам.