Язык программирования C++. Вводный курс

Словарь


Вот небольшая программа, иллюстрирующая построение отображения, поиск в нем и обход элементов. Здесь используются два отображения. Первое, необходимое для преобразования слов, содержит два элемента типа string. Ключом является слово, которое нуждается в специальной обработке, а значением– слово, заменяющее ключ. Для простоты мы задали пары ключ/значение непосредственно в тексте программы (вы можете модифицировать программу так, чтобы она читала их из стандартного ввода или из файла). Второе отображение используется для подсчета произведенных замен. Текст программы выглядит следующим образом:

#include <map>

#include <vector>

#include <iostream>

#include <string>

int main()

{

  map< string, string > trans_map;

  typedef map< string, string >::value_type valType;

  // первое упрощение:



  // жестко заданный словарь

  trans_map.insert( va1Type( "gratz", "grateful" ));

  trans_map.insert( va1Type( "'em",   "them"     ));

  trans_map.insert( va1Type( "cuz",   "because"  ));

  trans_map.insert( va1Type( "nah",   "no"       ));

  trans_map.insert( va1Type( "sez",   "says"     ));

  trans_map.insert( va1Type( "tanx",  "thanks"   ));

  trans_map.insert( va1Type( "wuz",   "was"      ));

  trans_map.insert( va1Type( "pos",   "suppose"  ));

  // напечатаем словарь

  map< string,string >::iterator it;

  cout << "Наш словарь подстановок: \n\n";

  for ( it = trans_map.begin();

          it != trans_map.end(); ++it )

      cout << "ключ: "   << (*it).first << "\t"

           << "значение: " << ("it).second << "\n";

  cout << "\n\n";

  // второе упрощение: жестко заданный текст

  string textarray[14]={ "nah", "I", "sez", "tanx",

              "cuz", "I", "wuz", "pos", "to", "not",

              "cuz", "I", "wuz", "gratz" };

  vector< string > text( textarray, textarray+14 );

  vector< string >::iterator iter;

  // напечатаем текст

  cout << "Исходный вектор строк:\n\n";

  int cnt = 1;

  for ( iter = text-begin(); iter != text.end();

                                      ++iter,++cnt )

      cout <<  *iter << ( cnt % 8 ? " " : "\n" );

  cout << "\n\n\n";

  // map для сбора статистики

  map< string,int > stats;

  typedef map< string,int >::value_type statsValType;

  // здесь происходит реальная работа

  for ( iter=text.begin(); iter != text.end(); ++iter )

  if (( it = trans_map.find( *iter ))

             != trans_map.end() )

  {

      if ( stats.count( *iter ))

          stats [ *iter ] += 1;

      else stats.insert( statsVa1Type( *iter, 1 ));

      *iter = (*it).second;

  }

  // напечатаем преобразованный текст

  cout << "Преобразованный вектор строк:\n\n";

  cnt = 1;

  for ( iter = text.begin(); iter != text.end();

                                      ++iter, ++cnt )

      cout << *iter << ( cnt % 8 ? " " : "\n" );

  cout << "\n\n\n";

  // напечатаем статистику

  cout << "И напоследок статистика:\n\n";

  map<string,int,less<string>,allocator>::iterator siter;

  for (siter=stats.begin(); siter!=stats.end(); ++siter)

    cout << (*siter).first     << " "

         << "было заменено "

         << (*siter).second

         << (" раз(а)\n" );

}

Вот результат работы программы:

Наш словарь подстановок:

key: 'em      value: them

key: cuz      value: because

key: gratz    value: grateful

key: nah      value: no

key: pos      value: suppose

key: sez      value: says

key: tanx     value: thanks

key: wuz      value: was

Исходный вектор строк:

nah I sez tanx cuz I wuz pos

to not cuz I wuz gratz

Преобразованный вектор строк:

no I says thanks because I was suppose

to not because I was grateful

И напоследок статистика:

cuz было заменено 2 раз(а)

gratz было заменено 1 раз(а)

nah было заменено 1 раз(а)

pos было заменено 1 раз(а)

sez было заменено 1 раз(а)

tanx было заменено 1 раз(а)

wuz было заменено 2 раз(а)



Содержание раздела