Итоги: частота слов
Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy. Урок 75 из 104.
Задание
ЛегкоДавайте создадим анализатор частотности слов, который обрабатывает текст и отображает количество слов, отсортированное по частотности. Это классическая задача обработки текста, объединяющая все изученные вами компоненты STL: map для подсчёта, vector для сортировки, итераторы для обхода и лямбда-выражения для пользовательской логики сортировки.
Вы организуете код в двух файлах:
WordAnalyzer.h: определите классWordAnalyzer, который управляет подсчётом и анализом слов.Ваш класс должен использовать внутри
std::map<std::string, int>для хранения количества слов. Реализуйте следующие методы:addWord(const std::string& word): увеличивает количество для данного словаgetCount(const std::string& word): возвращает количество для конкретного слова (0, если слово не найдено)getTotalWords(): возвращает общее количество добавленных слов (сумму всех количеств)getUniqueWords(): возвращает количество уникальных слов (размер карты)printByFrequency(): выводит все слова, отсортированные по частотности в порядке убывания. Слова с одинаковой частотностью сортируются в алфавитном порядке. Каждая строка должна отображать:word: count
Для
printByFrequency()вам нужно перенести содержимое карты в вектор пар, а затем использоватьstd::sortс лямбда-выражением, которое сначала сравнивает количество (по убыванию), а при равенстве — слово (по возрастанию).main.cpp: прочитайте целое числоnв первой строке, указывающее, сколько слов будет введено далее. Затем прочитайтеnслов, по одному в каждой строке.Создайте
WordAnalyzer, добавьте все слова, затем выведите:- Выведите
Total words: <count> - Выведите
Unique words: <count> - Выведите
Word frequencies:, после чего вызовитеprintByFrequency()
- Выведите
Например, при следующем вводе:
7
apple
banana
apple
cherry
banana
apple
dateВывод должен быть таким:
Total words: 7
Unique words: 4
Word frequencies:
apple: 3
banana: 2
cherry: 1
date: 1Обратите внимание, что apple находится первым (наибольшая частотность), за ним следует banana, а затем cherry и date сортируются в алфавитном порядке, поскольку у них одинаковое количество.
Другой пример с вводом:
5
the
cat
the
sat
theВывод:
Total words: 5
Unique words: 3
Word frequencies:
the: 3
cat: 1
sat: 1Попробуйте сами
#include <iostream>
#include <string>
#include "WordAnalyzer.h"
using namespace std;
int main() {
int n;
cin >> n;
WordAnalyzer analyzer;
// TODO: Прочитайте n слов и добавьте их в analyzer
// TODO: Выведите "Total words: <count>"
// TODO: Выведите "Unique words: <count>"
// TODO: Print "Word frequencies:" and call printByFrequency()
return 0;
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыСборка и компиляция C++Заголовочные файлы и файлы исходного кодаПространства имен и область видимостиВведение в ООП на C++Классы и объектыУказатель 'this'Методы (функции-члены)Атрибуты (члены данных)Основы конструкторов и деструкторовИтоги — Простой калькулятор4Свойства классов
Члены экземпляра против статическихГеттеры и сеттерыКонстантные функции-членыКлючевое слово mutableСтатические методы и переменныеДружественные функции и классыИтоги — Менеджер банковских счетов7Наследование
Основы наследованияУровни доступа при наследованииПорядок вызова конструкторов и деструкторовПереопределение методовВиртуальные функции и VTableМножественное наследованиеВиртуальное наследованиеИтоги — Иерархия сотрудников10Обзор STL
Обзор и философия STLКонтейнеры STLИтераторыАлгоритмы STLФункторы и лямбда-выраженияИтоги: частота слов13Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonFactory и Abstract FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy2Управление памятью
Стек и кучаУказатели и ссылкиДинамическая память (new/delete)Умные указатели в C++RAII в C++Итоги — Менеджер динамического массива5Инкапсуляция
Спецификаторы доступа в C++Спецификаторы доступа: подробный разборСокрытие данныхStruct против ClassВложенные и внутренние классыИтоги — Система учета студентов8Полиморфизм
Полиморфизм компиляции и времени выполненияПерегрузка функцийВиртуальные функции: повторениеЧистые виртуальные функцииАбстрактные классыПроектирование интерфейсов на C++Dynamic Casting и RTTIИтоги: Калькулятор фигур11Продвинутые концепции ООП
Композиция против наследованияМиксины через CRTPИдиома PimplСтирание типовEnum Classes и строгая типизацияОбработка исключений в ООППользовательские иерархии исключений14Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикRAII как паттерн3Конструкторы и деструкторы
Конструктор по умолчаниюПараметризованный конструкторКонструктор копированияКонструктор перемещенияСписки инициализации конструктораДелегирующие конструкторыГлубокое погружение в деструкторыПравило трех / пяти / нуляПовторение — класс String6Перегрузка операторов
Введение в перегрузку операторовПерегрузка арифметических операторовПерегрузка операторов сравненияОператоры потоковПерегрузка оператора присваиванияПерегрузка операторов [] и ()Операторы преобразования типовИтоги — класс Matrix9Шаблоны
Шаблоны функцийШаблоны классовСпециализация шаблоновВариативные шаблоныОсновы SFINAE и Type TraitsИтоги — Обобщенный контейнерПотренируйтесь самостоятельно: Онлайн-компилятор C++