## 8.3 プログラム例: スペルチェック

set を使用する簡単なプログラム例として、スペルチェックがあります。

> 注: このプログラムは spell.cpp ファイルにあります。

スペルチェックでは、2 つの入力ストリームを引数とします。1 つは正しいスペルのワードを表すストリーム (辞書) で、もう 1 つはテキストファイルです。開始するには、辞書を set に読み込みます。これは `copy()` 関数と入力ストリーム反復子で実行され、値が辞書のインサータにコピーされます。次に、テキストの語句が 1 つずつ検証され、辞書にあるかどうかが確認されます。辞書にない場合は、スペルが間違っている語句の set に追加されます。テキスト全体の検証が終了すると、スペルの間違っている語句の一覧が出力されます。

    void spellCheck (istream & dictionary, istream & text)
    {
       typedef set <string, less<string> > stringset;
       stringset words, misspellings;
       string word;
       istream_iterator<string, ptrdiff_t> dstream(dictionary), eof;

       // 最初に辞書を読み込む
       copy (dstream, eof, inserter(words, words.begin()));

       // 次にテキストを読み込む
       while (text >> word)
          if (! words.count(word))
             misspellings.insert(word);

       // 最後にすべてのスペルミスを出力する
       cout << "Misspelled words:" << endl;
       copy (misspellings.begin(), misspellings.end(),
          ostream_iterator<string>(cout, "\n"));
    }

スペルが間違っている各語句に対して、修正候補が表示されます。修正候補の検出に使用できる発見方法には、さまざまなものがあります。ここで使用する手法は、単純に隣接する文字を入れ替えるという方法です。これを検出するために、次の関数の呼び出しがスペルの間違った語句を表示するループに挿入されます。

    {
       for (int I = 1; I < word.length(); I++) {
          swap(word[I-1], word[I]);
          if (words.count(word))
             cout << "Suggestion: " << word << endl;
          // 語句を元に戻す
          swap(word[I-1], word[I]);
          }
    }

Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。
OEM リリース, 1998 年 6 月