Сегодня мы поговорим об алгоритмах в языке C++. Посмотрим алгоритмы, которые умеют работать с отдельными элементами, такие как, например, вычисление минимального или максимального из двух элементов, алгоритмы, которые сортируют некоторые коллекции, алгоритмы, которые работают с элементами в коллекции, например, могут посчитать количество вхождений того или иного элемента. А также посмотрим, как нам модифицировать коллекции, состоящие из элементов, например выполнить инкремент или декремент. Давайте начнём с чего-нибудь простого. Например, нам понадобится вычислить минимальное из двух целых чисел. Напишем функцию Min, которая будет принимать два числа, вычислять из них минимальное и возвращать его. Значит, определяем эту фунцию, возвращает она целое число. На вход принимает целое число a и целое число b. Значит, если a меньше b, то мы возвращаем a. И если a мы не вернули, то надо вернуть b. Классно! Мы написали нашу первую функцию. Давайте же запустим её поскорее и, например, вычислим минимальное из чисел два и три. Запускаем наш код и видим, что минимальное из чисел два и три — это число два. Оно работает правильно, здорово, наверняка нам может понадобиться вычислять максимум из двух чисел. Что мы для этого сделаем? Возьмём скопируем функцию Min. Переименуем её в Max. Так, и вроде всё должно заработать. Давайте скорее её запустим. Максимум от двух чисел, два и три. Запускаем наш код. Видим, что максимум равен двум, то есть два больше трёх. Так, мы явно где-то набажили. Где же мы набажили? А набажили мы при копировании, мы скопировали функцию и переименовали её, и не поправили логику, которая внутри делает содержательную часть. Конечно же здесь должно быть больше. Запустим наш код и видим, что, да, максимум теперь посчитался правильно. Он равен трём. Супер! То есть мы написали функцию Min и Max, при этом сделали один баг и ещё потратили время на то, чтоб его отладить. Здорово! Давайте теперь будем писать минимальную и максимальную из двух строчек. То есть что мы можем сделать? Закопировать вот эти две функции. Ладно, это мы делать не будем, потому что в стандартной библиотеке языка C++ есть встроенные функции минимум и максимум, и они могут работать не только с целыми числами, а также с вещественными числами, а также со строчками, и ещё со многими-многими другими типами, которые могут сравниваться друг с другом, проще говоря, у которых есть оператор меньше. Давайте же удалим весь тот код, который мы написали. Стандартные алгоритмы лежат в библиотеке algorithm. include algorithm. И всё, что нам осталось сделать в текущем коде, просто изменить первую букву в наших вызовах. А до этого она была большой, сделаем её маленькой, min и max. Видите, мы не написали почти ни строчки кода, мы просто воспользовались тем, что уже сделали для нас. Никакого велосипедирования. Запускаем наш код. Видим, что, да, два и три для функций min и максимум. Давайте объявим две строчки, назовём их s1, в одну положим abc, в другую строчку мы положим bca. Ну и посчитаем теперь просто минимум, максимум от этих двух строк. Запускаем наш код. Видим, что меньшая строчка — это abc, а большая строчка — это bca, потому что первый символ b, он больше, чем a. Здорово! И нам для этого не пришлось писать абсолютно никакого кода. Мы воспользовались всем, что уже сделали для нас. На самом деле, минимум и максимум — это слишком просто. Но они уже нам очень сильно облегчают жизнь. Никогда не пишите их самостоятельно, а если вы вдруг захотите написать какой-нибудь алгоритм, проверьте, что его уже не написали для вас. Давайте рассмотрим что-нибудь более сложное, например, сортировка. Пусть у нас будет вектор, в нём будут лежать целые числа. Объявим вектор. Положим в него числа один, три, два, пять, четыре. Блестяще, мы объявили вектор. И теперь мы можем отсортировать его. Чтобы работа наша была наглядной, напишем функцию PrintVector [БЕЗ_ЗВУКА] или просто Print, ведь то, что это вектор, будет понятно из первого аргумента. Вектор целых чисел мы передаём на вход и будем всегда выводить в поток cout по умолчанию. Воспользуемся нашим любимым циклом range-based for. И здесь я объявил переменную, она означает item, я просто взял первую букву. for item in vector cout i. И пробельчик в конце. Давайте, чтоб всё ещё было более наглядным, добавим сюда аргумент title, который мы будем выводить перед тем, как выводить вектор. title, затем выведем двоеточие, давайте двоеточие и пробел. Отлично! Распечатаем наш вектор с заголовком init. Initial вектор, тот, который мы создали по умолчанию. После этого воспользуемся функцией сортировки. Чтобы воспользоваться функцией сортировки, ей нужно передать начало интервала, который мы хотим сортировать, и конец интервала, который мы хотим посортировать. Взять начало и конец интервала, который мы хотим отсортировать, можно с помощью встроенных функций begin и end. Сейчас нам не важно, как они работают, нам важно, что begin от вектора вернёт его начало, а end от вектора вернёт его конец. И после этого над этим началом и концом можно запускать различные алгоритмы. Давайте же вызовем стандартную функцию сортировки. Первым аргументом передадим в неё начало вектора. Вторым аргументом передадим конец вектора. После этого распечатаем наш вектор и добавим слово sort. Так, надо сделать перенос строки. Итак, видим, что изначальный векторы был не отсортирован. Вот он, один, два, один, три, два, пять, четыре. После этого мы его посортировали и получили вектор один, два, три, четыре, пять. Как мы видим, стандартные алгоритмы очень сильно упрощают работу, работу над контейнерами, работу над повседневными задачами, которые мы решаем. Прежде чем писать свой алгоритм, всегда убедитесь, что его уже не написали за вас. В данном видео мы познакомились с алгоритмами min и max, а также с сортировкой. Напомню, алгоритмы min и max позволяют найти минимальные и максимальные из двух элементов, которые передаются на вход, а сортировка позволяет отсортировать контейнер. Главное, чтобы элементы в контейнере были сравнимы между собой, то есть поддерживали оператор меньше. Рекомендуется использовать именно эти алгоритмы в тех случаях, когда у вас есть желание написать свой собственный. Во-первых, они уже есть в стандартной библиотеке, во вторых они хорошо оттестированы. В следующем видео мы рассмотрим ещё несколько алгоритмов для работы с коллекциями.