[БЕЗ_ЗВУКА] Итак, мы увидели, что у нас бывает множество разных итераторов, некоторые можно вычислять друг из друга, некоторые — нельзя, из некоторых можно читать, из некоторых — нельзя, в некоторые можно только писать, как inserter и back_inserter. Давайте научимся читать документацию по языку C++. Например, посмотрим на сайт ru.cppreference.com. Вот так он пишется: ru.cppreference.com. На этом сайте вы можете найти документацию по контейнерам, по строчкам, по потокам, но нас интересует документация по алгоритмам в данном случае. Вот мы ее открываем и видим множество разных алгоритмов: тут есть известный нам all_of, count_if, алгоритмы модифицирующие, copy_if, например, алгоритм remove_if мы знаем, ну и множество других. Давайте посмотрим на конкретный алгоритм и попробуем понять по нему, что же он делает. Посмотрим, например, на алгоритм unique. Даже, наверное, unique_copy. Вот я кликаю на unique_copy, у меня открывается страница с документацией про этот алгоритм. Здесь я вижу, что unique_copy — это шаблонная функция, но этого мы ожидали. Она принимает InputIt first, InputIt last, OutputIt d_first. Что такое InputIt, OutputIt? Казалось бы, авторы хотят нам сказать, что эти итераторы разные. И действительно, итераторы бывают разными, мы об этом уже говорили, и для этих различных категорий итераторов есть специальные названия, которые как раз в документации используются. Какие там бывают категории? Бывает категория Input: это итераторы, с которых можно читать. Сюда подходят итераторы любых контейнеров: векторов, строк, множеств, но не подходят inserter и back_inserter. Есть итераторы forward и bidirectional. Это просто обычные итераторы, с которых можно читать. Опять же, нам подходят итераторы любых контейнеров, мы пока еще не рассматривали итераторы, которые могли бы быть Input, они могли бы быть forward, но, при этом, с forward-итераторами нужно быть осторожным. Бывают алгоритмы, которые по forward-итераторам что-то меняют. Например, мы уже рассматривали remove_if. Давайте откроем, увидим, что он принимает forward-итераторы. По forward-итераторам некоторые алгоритмы могут как менять информацию, так могут и не менять, поэтому вам нужно внимательно смотреть на описание алгоритма. Тут, например, видно: удаляет из диапазона элементы, удаление осуществляется путем сдвига элементов. Сразу видно, что итераторы множества передать сюда нельзя, а есть алгоритмы, которые принимают forward-итераторы, но при этом диапазон не меняют. Поэтому нужно внимательно смотреть описание алгоритма, если вы видите forward- или bidirectional-итераторы. Если речь о random-итераторах, то сюда подходят только итераторы векторов и строк. Собственно, это итераторы, к которым можно прибавлять число и которые можно вычитать друг из друга. И, наконец, бывают output-итераторы, в которые можно писать. Сюда подходят итераторы векторов и строк, потому что в них можно писать, и back_inserter и просто inserter. Ну, например, можем увидеть алгоритм, который принимают только random-итераторы. Давайте докрутим до чего-нибудь интересного. Операции разделения: вот тут видим partition. Вот и partial_sort. partial_sort принимает random-итераторы, сортирует часть элементов в диапазоне от first до last, он сортирует диапазон от first до middle, точнее, он сортирует диапазон от first до last так, чтобы первые от first до middle элементы были отсортированы. Но не очень важно, главное, чтобы вы понимали random-итераторы. И вы не сможете передать сюда итераторы множества не только потому, что этот алгоритм переставляет как-то данные внутри, но и потому, что он требует умения, скажем, прибавлять число к итератору, а итератор множеств такое не умеет. Итак, в этом видео мы узнали про итераторы back_inserter и inserter, специальные итераторы, с помощью которых можно делать, по сути, push_back-вектор и insert во множество, и узнали просто про классификацию категорий итераторов, научились заодно читать документацию по языку C++.