Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Поиск и извлечение элемента отображения
Оператор взятия индекса является простейшим способом извлечения элемента. Например: // map< string, int> word_count; int count = word_count[ " wrinkles" ]; Однако этот способ работает так, как надо, только при условии, что запрашиваемый ключ действительно содержится в отображении. Иначе оператор взятия индекса поместит в отображение элемент с таким ключом. В данном случае в word_count занесется пара
string( " wrinkles" ), 0
Класс map предоставляет две операции для того, чтобы выяснить, содержится ли в нем определенное значение ключа. · count(keyValue): функция-член count() возвращает количество элементов с данным ключом. (Для отображения оно равно только 0 или 1). Если count() вернула 1, мы можем смело использовать индексацию: int count = 0; if ( word_count.count( " wrinkles" )) count = word_count[ " wrinkles" ]; · find(keyValue): функция-член find() возвращает итератор, указывающий на элемент, если ключ найден, и итератор end() в противном случае. Например: int count = 0; map< string, int>:: iterator it = word_count.find( " wrinkles" ); if ( it! = word_count.end() ) count = (*it).second; Значением итератора является указатель на объект pair, в котором first содержит ключ, а second – значение. (Мы вернемся к этому в следующем подразделе.) Навигация по элементам отображения После того как мы построили отображение, хотелось бы распечатать его содержимое. Мы можем сделать это, используя итератор, начальное и конечное значение которого получают с помощью функций-членов begin() и end(). Вот текст функции display_map_text():
Если наше отображение не содержит элементов, данная функция не нужна. Проверить, пусто ли оно, можно с помощью функции-члена size(): if ( text_map-> size() ) display_map_text( text_map ); Но более простым способом, без подсчета элементов, будет вызов функции-члена empty(): if (! text_map-> empty() ) display_map_text( text_map );
Словарь Вот небольшая программа, иллюстрирующая построение отображения, поиск в нем и обход элементов. Здесь используются два отображения. Первое, необходимое для преобразования слов, содержит два элемента типа string. Ключом является слово, которое нуждается в специальной обработке, а значением – слово, заменяющее ключ. Для простоты мы задали пары ключ/значение непосредственно в тексте программы (вы можете модифицировать программу так, чтобы она читала их из стандартного ввода или из файла). Второе отображение используется для подсчета произведенных замен. Текст программы выглядит следующим образом:
} Вот результат работы программы:
Наш словарь подстановок:
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 раз(а)
Удаление элементов map Существуют три формы функции-члена erase() для удаления элементов отображения. Для единственного элемента используется erase() с ключом или итератором в качестве аргумента, а для последовательности эта функция вызывается с двумя итераторами. Например, мы могли бы позволить удалять элементы из text_map таким образом: string removal_word; cout < < " введите удаляемое слово: "; cin > > removal_word;
if ( text_map-> erase( remova1_word )) cout < < " ok: " < < remova1_word < < " удалено\n"; else cout < < " увы: " < < remova1_word < < " не найдено! \n"; Альтернативой является проверка: действительно ли слово содержится в text_map? 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 для каждого примера и укажите наиболее вероятный способ вставки и извлечения элементов. |
Последнее изменение этой страницы: 2019-04-09; Просмотров: 300; Нарушение авторского права страницы