Программирование >>  Инициализация объектов класса, структура 

1 ... 98 99 100 [ 101 ] 102 103 104 ... 395


<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() :



1 ... 98 99 100 [ 101 ] 102 103 104 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика