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

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

map(InputIter first. Inputlter last, const Compare& comp = CompareO);

map(const map <Key. T. Compare>& x);

}: Как видно из приведенного описания (оно дано с сокращениями), тип элементов словаря value_type определяется как пара элементов типа Key и Т.

Первый конструктор создает пустой словарь, используя указанный функциональный объект. Второй конструктор создает словарь и записывает в него элементы, определяемые диапазоном указанных итераторов. Время работы этого конструктора пропорционально количеству записываемых элементов, если они упорядочены, и квадрату количества элементов, если нет. Третий конструктор является конструктором копирования.

Как и для всех контейнеров, для словаря определены деструктор, операция присваивания и операции отношения. Итераторы словаря перечислены в табл. 12.

Для доступа к элементам по ключу определена операция [ ]:

Т& operator[](const Key & х);

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

finclude <fstream> finclude <iostream> finclude <string> #include <map> using namespace std;

typedef map <string. long; less <string> > map_sl; // 1 int main(){ map_sl ml;

ifstream in("phonebook"); string str; long num;

// Чтение номера

// Пропуск пробела

// Чтение фамилии

// Занесение в словарь

while (in » num. !in.eof()){ in.getO: getlineCin. str); ml[str] = num; cout « str « " " « num « endl;

// Дополнение словаря

// Вывод словаря

« endl;

// Вывод второго элемента

« endl;

}

ml["Petya P."] = 2134622;

map_sl ;; iterator i;

cout « "ml;" « endl;

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

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

i = ml.beginO; i++;

cout « "Второй элемент: ";

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

318

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

cout « "Vasia: " « ml["Vasia"] « end!; // Вывод элемента по ключу

return 0;

} Для улучшения читаемости программы введено более короткое обозначение типа словаря (оператор, помеченный //1). Сведения о каждом человеке расположены в файле phonebook на одной строке: сначала идет номер телефона, затем через пробел фамилия:

1001002 Petya К.

3563398 Ivanova N.M.

1180316 Vovochka

2334476 Vasia

Для итераторов словаря допустимы операции инкремента и декремента, но не операции + и -. Ниже приведен результат работы программы (обратите внимание, что словарь выводится в упорядоченном виде):

Petya К. 1001002

Ivanova N.M. 3563398

Vovochka 1180316

Vasia 2334476

ml:

Ivanova N.M. 3563398

Petya K. 1001002

Petya P. 2134622

Vasia 2334476

Vovochka 1180316

Второй элемент: Petya К. 1001002

Vasia: 2334476

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

iterator find(const key_type& x);

const_iterator find(const key_type& x) const:

iterator lower_bound(const key_type& x):

const_iterator lower_bound(const key_type& x) const:

iterator upper_bound(const key_type& x);

const_iterator upper_bound(const key_type &x) const:

size_type count(const key_type& x) const;

Функция find возвращает итератор на найденный элемент в случае успешного поиска или end() в противном случае.

Функция upper_bound возвращает итератор на первый элемент, ключ которого не меньше х, или end(), если такого нет (если элемент с ключом х есть в словаре, будет возвращен итератор на него).

Функция lower_bound возвращает итератор на первый элемент, ключ которого больше х, или end(), если такого нет.

Добавим в приведенный выше пример операторы

getline(cin. str);

if (ml.find(str) != ml.endO)