復習:単語の出現頻度
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 75/104。
チャレンジ
簡単テキストを処理し、頻度順にソートされた単語数を表示する単語頻度アナライザー(Word Frequency Analyzer)を作成しましょう。これは、これまでに学んだすべてのSTLコンポーネント(カウント用の map、ソート用の vector、トラバーサル用のイテレータ、カスタムソートロジック用のラムダ式)を組み合わせた、古典的なテキスト処理タスクです。
コードは2つのファイルに分けて構成します:
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()の実装では、マップの内容をペアのベクター(vector of pairs)に転送し、std::sortを使用します。ラムダ式を用いて、まずカウントで比較し(降順)、同じ場合は単語で比較(昇順)するようにします。main.cpp: 最初の行で、その後に続く単語の数を示す整数nを読み取ります。その後、n個の単語を1行ずつ読み取ります。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: 1apple が最初に表示され(最高頻度)、次に 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;
}
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタ引数付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ詳解Rule of Three / Five / Zeroまとめ - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () 演算子のオーバーロード型変換演算子まとめ:Matrix クラス