1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| fstream file_in( "in.txt", ios_base::in ), file_out( "out.txt", ios_base::out ); // открываем файлы с соответствующими режимами
multimap <string, string> ana_map; // набор пар типа pair<string, string>, с возможностью дубликации ключей
string str, sorted_str;
if ( !file_in.is_open( ) || !file_out.is_open( ) ) { // если какой-либо из файлов не открыт - ошибка и завершение программы
cout << "error opening files\n\n";
system( "pause" );
return -1;
}
typedef ctype <TCHAR> ctype_tchar;
size_t const size = ctype_tchar::table_size;
// ctype_tchar::mask table[ctype_tchar::table_size] = {ctype_tchar::mask( )}; <--- по идее, так правильней, относительно типа char, но, во-первых, как ни бейся, у меня выпадает ошибка constant expression requared, а во-вторых, нас ведь может больше интересовать wchar_t
ctype_tchar::mask table[256] = {ctype_tchar::mask( )}; // создаем таблицу масок символов
table[static_cast <size_t> ( ' ' )] = ctype_tchar::space; // модифицируем маску интересующих нас символов, ассоциируя их с пробелом
table[static_cast <size_t> ( ',' )] = ctype_tchar::space;
table[static_cast <size_t> ( '-' )] = ctype_tchar::space;
table[static_cast <size_t> ( ';' )] = ctype_tchar::space;
file_in.imbue( locale( file_in.getloc( ), new ctype_tchar( table ) ) ); // модифицируем локаль потока, добавляя созданные нами маски - все, поток будет считать пробелом любой указанный нами символ и соответственно будет обрабатывать его как разделитель
while ( !file_in.eof( ) ) { // заполняем ana_map из потока file_in
file_in >> str; // слова, разделенные пробелом, по одному помещаются в str
sorted_str = str;
sort( sorted_str.begin( ), sorted_str.end( ) ); // сортируем буквы в строчке sorted_str по возрастанию
ana_map.insert( pair <string, string> ( sorted_str, str ) ); // вставляем пару строчек в ana_map, где ключом служит сортированная строчка, а значением - исходное слово; простая форма записи типа "ana_map[sorted_str] = str;" у меня не компилируется по причине отсутствия оператора + в данном шаблоне multimap для типа string - хз почему, да и бог с ним
}
str = ana_map.begin( )->first;
for ( multimap <string, string> ::iterator it = ana_map.begin( ); it != ana_map.end( ); ++it ) { // проходим циклом по всем парам в ana_map последовательно, так как они отсортированы внутри по ключу, остается только отсечь лишнее и вывести все остальное :)
if ( ana_map.count( it->first ) > 1 ) { // отсекаем ключи, встречающиеся один раз
if ( str != it->first && file_out.tellp( ) ) { // разделяем наборы анаграмм по строчкам: если текущий ключ не равен предыдущему И фокус вывода НЕ находится в начале файла, то выводим в файл перенос строки
file_out << endl;
}
file_out << it->second << " ";
str = it->first;
}
}
file_in.close( );
file_out.close( ); |