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




Определение объекта map и заполнение его элементами


Чтобы определить объект класса map, мы должны указать, как минимум, типы ключа и значения. Например:

map<string,int> word_count;

Здесь задается объект word_count типа map, для которого ключом служит объект типа string, а ассоциированным с ним значением – объект типа int. Аналогично

class employee;

map<int,employee*> personnel;

определяет personnel как отображение ключа типа int (уникальный номер служащего) на указатель, адресующий объект класса employee.

Для нашей поисковой системы полезно такое отображение:

typedef pair<short,short> location;

typedef vector<location> loc;

map<string,loc*> text_map;

Поскольку имевшийся в нашем распоряжении компилятор не поддерживал аргументы по умолчанию для параметров шаблона, нам пришлось написать более развернутое определение:

map<string,loc*,   // ключ, значение

    less<string>,  // оператор сравнения

    allocator>     // распределитель памяти по умолчанию

text_map;

По умолчанию сортировка ассоциативных контейнеров производится с помощью операции “меньше”. Однако можно указать и другой оператор сравнения (см. раздел 12.3 об объектах-функциях).

После того как отображение определено, необходимо заполнить его парами ключ/значение. Интуитивно хочется написать примерно так:

#include <map>

#include <string>

map<string,int> word_count;

word_count[ string("Anna") ]  = 1;

word_count[ string("Danny") ] = 1;

word_count[ string("Beth") ]  = 1;

// и так далее ...

Когда мы пишем:

word_count[ string("Anna") ] = 1;

на самом деле происходит следующее:

1.      Безымянный временный объект типа string инициализируется значением "Anna" и передается оператору взятия индекса, определенному в классе map.

2.      Производится поиск элемента с ключом "Anna" в массиве word_count. Такого элемента нет.

3.      В word_count вставляется новая пара ключ/значение. Ключом является, естественно, строка "Anna". Значением – 0, а не 1.




Содержание  Назад  Вперед