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

1 ... 94 95 96 [ 97 ] 98 99 100 ... 395


/ / инициазируем копией всех пар кч/значение map< string, int > word count two( word count );

Посмотрим, как можно построить отображение для хранения нашего текста. Функция separate words() , описанная в разделе 6.8, создает два объекта: вектор строк, хранящий все слова текста, и вектор позиций, хранящий пары (номер строки, номер колонки) для каждого слова. Таким образом, первый объект дает нам множество значений ключей нашего отображения, а второй - множество ассоциированных с ними значений.

separate words() возвращает эти два вектора как объект типа pair, содержащий указатели на них. Сделаем эту пару аргументом функции build word map() , в

typedef для удобства чтения typedef pair< short,short > location; typedef vector< location > loc; typedef vector< string > text; typedef pair< text*,loc* > text loc;

extern map< string, loc* >*

результате которой будет получено соответствие между словами и позициями:

build word map( const text loc *text locations );

Сначала выделим память для пустого объекта map и получим из аргумента-пары

map<string,loc*> *word map = new map< string, loc* >; vector<string> *text words = text locations->first;

указатели на векторы:

vector<location> *text locs = text locations->second;

Теперь нам надо синхронно обойти оба вектора, учитывая два случая:

слово встретилось впервые. Нужно поместить в map новую пару ключ/значение;

слово встречается повторно. Нам нужно обновить вектор позиций, добавив дополнительную пару (номер строки, номер колонки).

Вот текст функции:



register int elem cnt = text words->size(); for ( int ix=0; ix < elem cnt; ++ix )

string textword = ( *text words )[ ix ];

игнорируем слова короче трех букв или присутствующие в списке стоп-слов ( textword.size() < 3

или

exclusion set.count( textword )) continue;

определяем, занесено слово в отображение если count() возвращает 0 - нет: добавим его if ( ! word map->count((*text words)[-ix] )) {

loc *ploc = new vector<location>; ploc->push back( (*text locs) [ix] ); word map->insert(value type((*text words)[ix],ploc)

else

добавим дополнительные координаты (*word map)[(*text words)[ix]]->

push back((*text locs)[ix]);

(*word map)[(*text words)[ix]]->

Синтаксически сложное выражение

push back((*text locs)[ix]);

возьмем слово, которое надо обновить string word = (*text words) [ix];

возьмем значение из вектора позиций vector<location> *ploc = (*word map) [ word ];

возьмем позицию - пару координат loc = (*text locs)[ix];

вставим новую позицию

будет проще понять, если мы разложим его на составляющие:

ploc->push back(loc);

Выражение все еще остается сложным, так как наши векторы представлены указателями. Поэтому вместо употребления оператора взятия индекса:

string word = text words[ix]; ошибка мы вынуждены сначала разыменовать указатель на вектор:

string word = (*text words) [ix]; правильно



int main()

считаем файл и в1деляем слова

vector<string, allocator> *text file = retrieve text text loc *text locations = separate words( text file

обработаем слова

...

построим отображение слов на векторы позиций )<string,lос*,less<string>,allocator>

*text map = build word map( text locatons );

Вот как выглядит вызов этой функции из main() :

6.12.2. Поиск и извлечение элемента отображения

Оператор взятия индекса является простейшим способом извлечения элемента.

map<string,int> word count; Например:

int count = word count[ wrinkles ];

Однако этот способ работает так, как надо, только при условии, что запрашиваемый ключ действительно содержится в отображении. Иначе оператор взятия индекса поместит в отображение элемент с таким ключом. В данном случае в word count занесется пара

i string( wrinkles ), 0

Класс map предоставляет две операции для того, чтобы выяснить, содержится ли в нем определенное значение ключа.

count(keyValue) : функция-член count() возвращает количество элементов с данн1м ключом. (Для отображения оно равно только 0 или 1). Если count()

int count = 0;

if ( word count.count( wrinkles ))

вернула 1 , мы можем смело использовать индексацию:

count = word count[ wrinkles ];

В конце концов build word map() возвращает построенное отображение:

return word map;



1 ... 94 95 96 [ 97 ] 98 99 100 ... 395

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