Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
63
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Глава 12. Контейнерные классы

319

cout « ml [str]: else{

cout « (*ml.upper_bound(str)).first « " " ; cout « (*ml.lower_bound(str)).first « " " ; } Если ввести с клавиатуры фамилию, которая есть в словаре, будет выведен соответствующий номер телефона, а иначе — два раза подряд первая из фамилий, которая по алфавиту следует за введенной, например:

Petya M. // Подчеркиванием обозначен ввод пользователя Petya P. Petya P.

Функция count возвращает количество элементов, ключ которых равен х (таких элементов может быть 0 или 1).

Для вставки и удаления элементов определены функции:

pair<iterator, bool> insert(const value_type& x);

iterator insert(iterator position, const value_type& x);

template <class Inputlter>

void insertdnputlter first, Inputlter last);

void erase(iterator position);

size_type erase(const key_type& x);

void erase(iterator first, iterator last);

void clearO;

Первая форма функции используется для вставки в словарь пары «ключ—значение». Функция возвращает пару, состоящую из итератора, указывающего на вставленное значение, и булевого признака результата операции: true, если записи с таким ключом в словаре не было (только в этом случае происходит добавление), и false в противном случае (итератор указывает на существующую запись). Время работы функции пропорционально логарифму количества элементов в словаре.

Таким образом, скорректировать существующую запись, используя функцию вставки, нельзя. Это делается с помощью операции доступа по индексу.

Ниже приведено несколько примеров вставки в словарь, тип которого описан в предыдущем листинге:

map_sl m2; // Создание пустого словаря

m2.insert(map_sl::value_type("Lena", 3157725));

str = "Anna";

num = 5536590;

m2.insert(make__pair(str, num));

num = 5530000:

// Попытка вставки существующей записи:

m2.insert(make_pair(str, num));

i = ml.beginO;

m2.insert(*i); // Вставка в m2 первого элемента словаря ml

m2["Lena"] = 2222222; // Корректировка элемента

for (i = m2.begin(); i != m2.end(); i++) // Вывод словаря

cout « (*i).first « " " « (*i).second « endl;

320

Часть III. Стандартная библиотека

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

Anna 5536590 Ivanova N.M. 3563398 Lena 2222222

Вторая форма функции insert применяется для ускорения процесса вставки. С этой целью ей передается первым параметром позиция словаря, начиная с которой требуется осуществлять поиск места вставки1. Вставка выполняется только в случае отсутствия значения х в словаре. Функция возвращает итератор на элемент словаря с ключом, содержащимся в х.

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

#include <iostream>

#include <string>

#include <map>

using namespace std:

typedef map <string, long, less <string> > map_sl;

typedef pair <string. long > pair_sl;

int main(){

pair_sl p[3]'= { pair_sl("Anna\ 123123). pair_sl("Maria", 234234), pair_sl("Teresa". 345345)}: map_sl ml;

map_sl :: iterator i = ml.beginO; for (int k = 0; k<3; k++)

i = ml.insertd . p[k]); // sic!

for (i = ml.beginO; i != ml.endO; i++)

cout « (*i).first « " " « (*i).second « endl; return 0; } Третья форма функции insert используется для вставки группы элементов, определяемой диапазоном итераторов. Функции удаления элементов и очистки словаря аналогичны одноименным функциям других контейнеров: первая форма функции erase удаляет элемент словаря из позиции, заданной итератором, вторая — по заданному ключу, а третья удаляет диапазон- элементов.

Операции вставки в словарь не приводят к порче связанных с ними итераторов и ссылок, а операции удаления делают недействительными только итераторы и ссылки, связанные с удаляемыми элементами.

Для обмена всех элементов двух словарей применяется функция swap:

template <class Key, class T, class Compare>

void swap(map<Key. T, Compare>& x, map<Key, T, Compare>& y);

1 Если указанная позиция находится после места, в которое требуется вставить элемент, вставка будет все равно выполнена верно.