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

1 ... 96 97 98 [ 99 ] 100 101 102 ... 395


Наш словарь подстановок:

key: em value: them

key: cuz value: because

key: gratz value: grateful

key: nah value: no

key: pos value: suppose

key: sez value: says

key: tanx value: thanks

key: wuz value: was

Исходнтй вектор строк:

nah I sez tanx cuz I wuz pos

to not cuz I wuz gratz

Преобразованнтй вектор строк:

no I says thanks because I was suppose

to not because I was grateful

И напоследок статистика:

cuz было заменено 2 раз(а) gratz было заменено 1 раз(а) nah было заменено 1 раз( а) pos было заменено 1 раз( а) sez было заменено 1 раз( а) tanx было заменено 1 раз ( а ) wuz было заменено 2 раз( а)

6.12.5. Удаление элементов map

Существуют три формы функции-члена erase() для удаления элементов отображения. Для единственного элемента используется erase() с ключом или итератором в качестве аргумента, а для последовательности эта функция вызывается с двумя итераторами.

string removal word; cout << введите удаляемое слово: ; cin >> removal word;

if ( text map->erase( remova1 word ))

cout << ok: << remova1 word << удалено\n ;

Например, мы могли бы позволить удалять элемента: из text miap таким образом: else cout << увы: << remova1 word << не найдено!\n ;

Альтернативой является проверка: действительно ли слово содержится в text miap?

Вот результат работы программ::



map<string,loc*>::iterator where; where = text map.find( remova1 word );

if ( where == text map->end() )

cout << увы: << remova1 word << не найдено!\n ;

else {

text map->erase( where );

cout << ok: << remova1 word << удалено!\n ;

В нашей реализации text map с каждым словом сопоставляется множество позиций, что несколько усложняет их хранение и извлечение. Вместо этого можно было бы иметь по одной позиции на слово. Но контейнер map не допускает дублирующиеся ключи. Нам следовало бы воспользоваться классом multimap, который рассматривается в разделе 6.15.

Упражнение 6.20

Определите отображение, где ключом является фамилия, а значением - вектор с именами детей. Поместите туда как минимум шесть элементов. Реализуйте возможность делать запрос по фамилии, добавлять имена и распечатывать содержимое.

Упражнение 6.21

Измените программу из предыдущего упражнения так, чтобы вместе с именем ребенка записывалась дата его рождения: пусть вектор-значение хранит пары строк - имя и дата.

Упражнение 6.22

Приведите хотя бы три примера, в которых нужно использовать отображение. Напишите определение объекта map для каждого примера и укажите наиболее вероятный способ вставки и извлечения элементов.

6.13. Построение набора стоп-слов

Отображение состоит из нар ключ/значение. Множество (set), напротив, содержит неупорядоченную совокупность ключей. Например, бизнесмен может составить черный список bad checks, содержащий имена лиц, в течение последних двух лет присылавших фальшивые чеки. Множество полезно тогда, когда нужно узнать, содержится ли определенное значение в списке. Скажем, наш бизнесмен, принимая чек от кого-либо, может проверить, есть ли его имя в bad checks.

Для нашей поисковой системы мы построим набор стоп-слов - слов, имеющих семантически нейтральное значение (артикли, союзы, предлоги), таких, как the, and, into, with, but и т. д. (это улучшает качество системы, однако мы уже не сможем найти первое предложение из знаменитого монолога Гамлета: To be or not to be? ). Прежде чем добавлять слово к word map, проверим, не содержится ли оно в списке стоп-слов. Если содержится, проигнорируем его.

6.13.1. Определение объекта set и заполнение его элементами

Перед использованием класса set необходимо включить соответствующий заголовочный файл:



exclusion set.insert( the );

Отдельные элементы могут добавляться туда с помощью операции insert() . Например:

exclusion set.insert( and );

Передавая insert() пару итераторов, можно добавить целый диапазон элементов. Скажем, наша поисковая система позволяет указать файл со стоп-словами. Если такой

typedef set< string >::difference type diff type; set< string > exclusion set;

ifstream infile( exclusion set ); if ( ! infile )

static string default excluded words[25] = {

the , and , but , that , then , are , been , can . cant , cannot , could , did , for , had , have , him , his , her , its , into , were , which , when , with , would

<< используется стандартн набор слов \n ;

предупреждение! невозможно открыть файл стоп-слов!

copy( default excluded words, default excluded words+25, inserter( exclusion set, exclusion set.begin() ));

else {

istream iterator<string,diff type> input set(infile),eos; copy( input set, eos, inserter( exclusion set, exclusion set.begin() ));

файл не задан, берется некоторый набор слов по умолчанию:

В этом фрагменте кода встречаются два элемента, которые мы до сих пор не рассматривали: тип difference type и класс inserter. difference type - это тип результата вычитания двух итераторов для нашего множества строк. Он передается в качестве одного из параметров шаблона istream iterator.

copy() -один из обобщенных алгоритмов. (М1 рассмотрим их в главе 12 и в Приложении.) Первые два параметра - пара итераторов или указателей - задают диапазон. Третий параметр является либо итератором, либо указателем на начало контейнера, в который элементы копируются.

Проблема с этой функцией вызвана ограничением, вытекающим из ее реализации: количество копируемых элементов не может превосходить числа элементов в контейнере-адресате. Дело в том, что copy() не вставляет элементы, она только присваивает

#include <set> Вот определение нашего множества стоп-слов:

set<string> exclusion set;



1 ... 96 97 98 [ 99 ] 100 101 102 ... 395

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