Читаем C++ для начинающих полностью

Посмотрим, как можно построить отображение для хранения нашего текста. Функция 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 и получим из аргумента-пары указатели на векторы:


mapstring,loc* *word_map = new map string, loc* ;

vectorstring *text_words = text_locations-first;

vectorlocation *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 ];


// игнорируем слова короче трех букв

// или присутствующие в списке стоп-слов

if ( textword.size() 3 ||

exclusion_set.count( textword ))

continue;


// определяем, занесено ли слово в отображение

// если count() возвращает 0 - нет: добавим его

if ( ! word_map-count((*text_words)[-ix] ))

{

loc *ploc = new vectorlocation;

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];


// возьмем значение из вектора позиций

vectorlocation *ploc = (*word_map) [ word ];


// возьмем позицию - пару координат

loc = (*text_locs)[ix];


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

ploc-push_back(loc);


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


string word = text_words[ix]; // ошибка


мы вынуждены сначала разыменовать указатель на вектор:


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


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


return word_map;


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


int main()

{

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

vectorstring, allocator *text_file = retrieve_text();

text_loc *text_locations = separate_words( text_file );


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


// ...


// построим отображение слов на векторы позиций

mapstring,lос*,lessstring,allocator

*text_map = build_word_map( text_locatons );

// ...

}


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


Перейти на страницу:

Похожие книги

Язык программирования C++. Пятое издание
Язык программирования C++. Пятое издание

Лучшее руководство по программированию и справочник по языку, полностью пересмотренное и обновленное под стандарт С++11!Р'С‹ держите в руках новое издание популярного и исчерпывающего бестселлера по языку программирования С++, которое было полностью пересмотрено и обновлено под стандарт С++11. Оно поможет вам быстро изучить язык и использовать его весьма эффективными и передовыми способами. Р' соответствии с самыми передовыми и современными методиками изложения материала авторы демонстрируют использование базового языка и его стандартной библиотеки для разработки эффективного, читабельного и мощного кода.С самого начала этой книги читатель знакомится со стандартной библиотекой С++, ее самыми популярными функциями и средствами, что позволяет сразу же приступить к написанию полезных программ, еще не овладев всеми нюансами языка. Большинство примеров из книги было пересмотрено так, чтобы использовать новые средства языка и продемонстрировать РёС… наилучшие СЃРїРѕСЃРѕР±С‹ применения. Эта книга — не только проверенное руководство для новичков в С++, она содержит также авторитетное обсуждение базовых концепций и методик языка С++ и является ценным ресурсом для опытных программистов, особенно желающих побыстрей узнать об усовершенствованиях С++11.Стенли Р'. Липпман работал старшим консультантом в Jet Propulsion Laboratory, архитектором РіСЂСѓРїРїС‹ Visual С++ корпорации Microsoft, техническим сотрудником Bell Laboratories и главным инженером- программистом по анимации в кинокомпаниях Disney, DreamWorks, Pixar и PDI.Р–РѕР·и Лажойе, работающий ныне в кинокомпании Pixar, был членом канадской РіСЂСѓРїРїС‹ разработчиков компилятора C/C++ корпорации IBM, а также возглавлял рабочую группу базового языка С++ в составе международной организации по стандартизации ANSI/ISO.Барбара Э. Му имеет почти тридцатилетний опыт программирования. На протяжении пятнадцати лет она работала в компании AT&T, сотрудничая с Бьярне Страуструпом, автором языка С++, и несколько лет руководила РіСЂСѓРїРїРѕР№ разработчиков С++.• Узнайте, как использовать новые средства языка С++11 и стандартной библиотеки для быстрого создания надежных программ, а также ознакомьтесь с высокоуровневым программированием• Учитесь на примерах, в которых показаны передовые стили программирования и методики проектирования• Р

Барбара Э. Му , Жози Лажойе , Стенли Б. Липпман

Программирование, программы, базы данных
1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT
Access 2002: Самоучитель
Access 2002: Самоучитель

В книге рассматривается широкий круг вопросов, связанных с использованием программной среды Access 2002, которая является составной частью пакета Office 2002 и предназначена для создания банка данных в самых различных предметных областях.Подробно описывается методика проектирования объектов базы данных (таблицы, формы, отчеты, страницы доступа к данным, запросы, модули).Детально обсуждаются вопросы создания интегрированной базы данных в единой среде Access 2002: формирование БД с нуля, конвертирование в программную среду баз данных, созданных в ином программном окружении – Clarion, FoxPro.Особое внимание уделяется формированию разнообразных запросов к интегрированной базе данных Access 2002 с использованием языков программирования SQL, VBA и макросов.Приводятся общие сведения о возможностях языка обмена данными между различными компьютерами и приложениями (XML). Описываются возможности использования гиперссылок, связывающих базу данных с другими программными продуктами. Объясняется, как можно работать с базой данных Access 2002 без установки ее на компьютер, используя технологию ODBC (Open Data Base Connectivity). В приложениях приводятся количественные параметры Access 2002 и связанная с этой СУБД терминология.Предлагаемая книга будет полезна специалистам, занимающимся практической разработкой банков данных и приложений на их основе, а также студентам вузов, изучающим информатику.

Павел Юрьевич Дубнов

Программирование, программы, базы данных / ОС и Сети / Книги по IT