С++ для начинающих

       

Удаление элементов 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 для каждого примера и укажите наиболее вероятный способ вставки и извлечения элементов.



Содержание раздела