とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

すべてのアナグラムグループを検索するプログラム

STL―標準テンプレートライブラリによるC++プログラミング 第2版
単語辞書 の中からアナグラムを探して表示するプログラム。
std::istream_iterator が新登場してる気がする。std::ostream_iterator の逆で istream から入力用のイテレータを作る事ができます。

// P217 ex12-01.cpp
#include<iostream>
#include<string>
#include<fstream>
#include<iterator>
#include<vector>
#include<algorithm>
int main(){
 using std::cout;
 using std::flush;
 using std::string;
 using std::cin;
 using std::ifstream;
 using std::endl;
 using std::istream_iterator;
 using std::vector;
 using std::copy;
 using std::back_inserter;
 using std::sort;
 using std::binary_search;
 using std::next_permutation;
 cout << "Anagram finding program:\n"
  "finds all words in a dictionary that can\n"
  "be formed with the letters of a given word.\n"
  "First, enter the name of the file containing\n"
  "the dictionary: " << flush;
 string dictionaryName;
 cin >> dictionaryName;
 ifstream ifs(dictionaryName.c_str());
 if(!ifs.is_open()){
  cout << "Eh? Could not open file named " << dictionaryName << endl;
  return 1;
 }
 cout << "\nReading the dictionary ..." << flush;
 istream_iterator<string> ifsItr(ifs), ifsEnd;
 vector<string> dictionary;
 copy(ifsItr, ifsEnd, back_inserter(dictionary));
 cout << "\nThe dictionary contains " << dictionary.size() << " words.\n\n"
  "Now type a word (or any string of letters),\n"
  "and I'll see if it has any anagrams: " << flush;
 for(istream_iterator<string> cinIter(cin), cinEnd;
  cinIter != cinEnd; ++cinIter)
 {
  string word = *cinIter;
  sort(word.begin(), word.end());
  bool foundOne = false;
  do{
   if(binary_search(dictionary.begin(), dictionary.end(), word)){
    cout << ' ' << word << endl;
    foundOne = true;
   }
  }while(next_permutation(word.begin(), word.end()));
  if(!foundOne)cout << " Sorry, none found.\n";
  cout << "\nType another word (or the end-of-file char to stop): " << flush;
 }
}