|
Программирование >> Инициализация объектов класса, структура
<algorithm> #include <string> С++iдляlнаeинVюItих> 303 #include <utility> #include <map> #include <set> #include <algorithm> заголовочн файл iostream, не отвечающий стандарту #include <fstream.h> заголовочнхе фай1 С #include <stddef.h> #include <ctype.h> typedef для удобства чтения typedef pair<short,short> location; typedef vector<location,allocator> loc; typedef vector<string,allocator> text; typedef pair<text*,loc*> text loc; class TextQuery { public: TextQuery() { memset( this, 0, sizeof( TextQuery )); } static void filter elements( string felems ) { filt elems = felems; } void query text(); void display map text(); void display text locations(); void doit() { retrieve text(); separate words(); filter text(); suffix text(); strip caps(); build word map(); private: void retrieve text(); void separate words(): void filter text(); void strip caps(); void suffix textQ; void suffix s( strings ); void build word map(); private: vector<string,allocator> *lines of text; text loc *text locations; map< string,loc*, less<string>,allocator> *word map; static string filt elems; string Textery::filt elems( \ , ;: !?)(\V ); int main() { TextQuery tq; tq.doit(); tq.query text(); tq.display map text(); void TextQuery:: retrieve text() { string file name; cout << please enter file name: ; cin >> file name; ifstream infile( file name.c str(), ios::in ); set<string> exclusion set; ifstream infile( exclusion set ); copy( default excluded words, default excluded words+25, набора стон-слов (это упоминается в разделе 6.13.1, а детально рассматривается в 12.4.1). inserter(exclusion set, exclusion set.begin() )); Упражнение 6.26 Первоначальная реализация поисковой системы отражает процедурный подход: набор глобальных функций оперирует набором независимых структур данных. Окончательный вариант представляет собой альтернативный подход, когда мы инкапсулируем функции и данные в класс TextQuery. Сравните оба способа. Каковы недостатки и преимущества каждого? Упражнение 6.27 В данной версии программа: имя файла с текстом вводится но запросу. Более удобно было бы задавать его как параметр командной строки; в главе 7 м1 покажем, как это делается. Какие еще параметры командной строки желательно реализовать? 6.15. Контейнеры multimap и multiset Контейнеры map и set не допускают повторяющихся значений ключей, а multimap (мультиотображение) и multiset (мультимножество) позволяют сохранять ключи с дублирующимися значениями. Например, в телефонном справочнике может понадобиться отдельный список номеров для каждого абонента. В перечне книг одного автора может быть несколько названий, а в нашей программе с одним словом текста сопоставляется несколько позиций. Для использования miultimiap и miultiset нужно #include <map> multimap< key type, value type > multimapName; кч - string, значение - list< string > multimap< string, list< string > > synonyms; #include <set> включить соответствующий заголовочный файл - map или set: multiset< type > multisetName; Для прохода по мультиотображению или мультимножеству можно воспользоваться комбинацией итератора, который возвращает find() (он указывает на первый найденный элемент), и значения, которое возвращает count(). (Это работает, поскольку в данных контейнерах элементы с одинаковыми ключами обязательно являются соседними). Например: Упражнение 6.25 Объясните, почему нам потребовался специальный класс inserter для заполнения #include <map> #include <string> void code fragment() { multimap< string, string > authors; string search item( Alain de Botton ); ... int number = authors.count( search item ); mu1timap< string,string >::iterator iter; iter = authors.find( search item ); for ( int cnt = 0; cnt < number; ++cnt, ++-iter ) do something( *iter ); ... Более элегантный способ перебрать все значения с одинаковыми ключами использует специальную функцию-член equal range (), которая возвращает пару итераторов. Один из них указывает на первое найденное значение, а второй - на следующее за последним найденным. Если последний из найденных элементов является последним в контейнере, второй итератор содержит величину, равную end() :
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |