Итоги: частота слов
Часть раздела Объектно-ориентированное программирование путешествия по 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: Вывести "Word frequencies:" и вызвать 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Итоги — Обобщенный контейнер