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]); } }