|
Программирование >> Инициализация объектов класса, структура
/ / инициазируем копией всех пар кч/значение 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;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |