Словарь
Вот небольшая программа, иллюстрирующая построение отображения, поиск в нем и обход элементов. Здесь используются два отображения. Первое, необходимое для преобразования слов, содержит два элемента типа 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 раз(а)