Здравствуйте! Сейчас мы начинаем наш новый пояс по C++ — коричневый. И вы можете видеть этот коричневый пояс на моей футболке. Меня зовут Николай Субоч, я работаю в компании Яндекс и я проведу для вас первое занятие. Наше занятие будет посвящено эффективному использованию ассоциативных контейнеров в C++. Вы уже знаете, что такое ассоциативные контейнеры — это контейнеры, которые хранят значения по различным ключам. Вспомните, например, контейнер "Map" из прошлых курсов — это их типичный представитель. В примере на слайде ключом является строка. Зная эту строку-ключ, вы можете добавлять, модифицировать, удалять и искать данные в контейнере, как указано на слайде. Другим примером, еще более простым, можно считать контейнер "Vector", где ключи — это просто индексы, целые числа. Для того, чтобы познакомиться с другими, более эффективными контейнерами, давайте решим наглядную задачу. Для задачи нам нужен хороший длинный текст. Мы выбрали текст про Шерлока Холмса. Давайте проанализируем его и узнаем — какие слова встречались в тексте чаще всего? Обратимся к нашему коду, что у нас будет? Мы завели контейнер "Map" от типов string и int, чтобы считать количество строк. И текст записан в файле "input.txt". Давайте прочитаем его и положим содержимое файла в контейнер "Freqs" с частотами. Напишем цикл. Мы должны это считывать в какую-то строковую переменную. Пока у нас файл не пустой, мы в контейнер "Freqs" добавляем эту строчку, если ее нет. А если есть, то увеличиваем значение. Теперь у нас в контейнере "Freqs" лежат частоты слов, подсчитанные из файла. Давайте в цикле распечатаем содержимое этого контейнера и убедимся, что там лежит то, что мы ожидаем. Для этого воспользуемся функцией "Head", которая объявлена в заголовочном файле "head.h". Вы ее можете помнить из наших прошлых курсов. Мы ее использовали затем, чтобы распечатать только первые 10 элементов из нашего контейнера. Давайте соберем нашу программу и запустим. Что мы видим? Что у нас, действительно, есть список слов, вот эти слова, начинаются все на букву "A". И вот у нас есть частоты этих слов. То есть, мы знаем, сколько раз каждое слово встречалось в тексте. И это здорово, однако мы хотим решить не ту задачу. Здесь у нас слова отсортированы по алфавиту. Они отсортированы по алфавиту, потому что у нас в контейнере "Map" ключом является строка. А нам нужно отсортировать их по частоте, чтобы выбрать самые часто используемые. Как нам это сделать? Давайте просто переложим эти слова из "Map" в вектор "Pair". Почему "Pair" — потому что у нас в контейнере "Map" хранятся пары ключ-значение. Мы эти самые пары ключ-значение, собственно, такого же типа переложим в вектор "Words" и скопируем в него все эти пары из контейнера "Freqs" от начала до конца. Затем мы отсортируем этот вектор, отсортируем его в нужном нам порядке. Напишем компаратор, который сравнивает частоты. И таким образом, после сортировки этого вектора, в его начале будет лежать то, что нам необходимо — самые часто используемые слова. Ну что ж, давайте выберем эти слова. Возьмем наш цикл, который печатает и распечатаем, — правда, не контейнер "Freqs", — а распечатаем вектор "Words", который у нас к этому моменту уже отсортирован. Компилируем и запускаем программу. Смотрим, что получилось. Вот то, что у нас лежит в контейнере "Map" — это первые 10 слов, первые по алфавиту, они отсортированы по ключу. Вот второй вывод — это слова, которые отсортированы по частотам. Самое часто используемое слово — это артикль "The". Дальше идут предлоги, другие артикли, местоимения. Собственно, ожидаемо, так и должно быть в английском языке. Мы можем сделать предположение, что мы сейчас правильно решили нужную нам задачу. На этом первое видео закончено и мы в нем решили задачу в два этапа: во-первых, мы заполнили контейнер "Map" словами из файла; во-вторых, мы отсортировали вектор в нужном нам порядке. И в следующем видео мы узнаем, как решить эту задачу эффективнее.