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