Программирование >>  Инициализация объектов класса, структура 

1 ... 93 94 95 [ 96 ] 97 98 99 ... 395


string ery( pickle ); vector< location > *locat;

возвращается location<vector>*, ассоциированн с pickle

номер колонки). Для доступа применяется оператор взятия индекса. Например:

locat = text map[ query ];

Ключом здесь является строка, а значение имеет тип location<vector>*.

Для использования отображения необходимо включить соответствующий заголовочный файл:

#include <map>

Какие основные действия производятся над ассоциативными контейнерами? Их заполняют элементами или проверяют на наличие определенного элемента. В следующем подразделе мы покажем, как определить пару ключ/значение и как поместить такие пары в контейнер. Далее мы расскажем, как сформулировать запрос на поиск элемента и извлечь значение, если элемент существует.

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

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

map<string,int> word count; Здесь задается объект word count тина miap, для которого ключом служит объект тина

class employee;

string, а ассоциированн1м с ним значением - объект тина int. Аналогично

map<int,employee*> personnel;

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

6.12. Строим отображение позиций слов

В этом разделе мы построим отображение (map), позволяющее для каждого уникального слова текста сохранить номера строк и колонок, в которых оно встречается. (В следующем разделе мы изучим ассоциативный контейнер set.) В общем случае контейнер set полезен, если мы хотим знать, содержится ли определенный элемент в некотором множестве, а map позволяет связать с каждым из них какую-либо величину.

В miap хранятся нары ключ/значение. Ключ играет роль индекса для доступа к ассоциированному с ним значению. В нашей программе каждое уникальное слово текста будет служить ключом, а значением станет вектор, содержащий пары (номер строки,



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

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

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

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

word count[ string( Anna ) ] = 1; на самом деле происходит следующее:

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

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

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

4. После этого значению присваивается величина 1.



предпочтительна метод вставки одного элемента word count.insert(

map<string,i nt>::

value type( string( A\nna ), 1 )

Для вставки одного элемента предпочтительнее использовать следующий метод:

В контейнере map определен тип value type для представления хранимых в нем пар

map< string,int >::

ключ/значение. Строки

value type( string( Anna ), 1 )

создают объект pair, который затем непосредственно вставляется в map. Для удобства чтения можно использовать typedef:

typedef map<string,int>::value type valType;

Теперь операция вставки выглядит проще:

word count.insert( valType( string( Anna ), 1 ));

Чтобы вставить элементы из некоторого диапазона, можно использовать метод insert() ,

map< string, int > word count; ... заполнить

map< string,int > word count two; скопируем все пары ключ/значение

принимающий в качестве параметров два итератора. Например:

word count two.insert(word count.begin(),word count.end());

Mi могли бы сделать то же самое, просто нроинициализировав одно отображение другим:

Если элемент отображения вставляется в отображение с помощью операции взятия индекса, то значением этого элемента становится значение по умолчанию для его типа данных. Для встроенных арифметических типов - 0.

Следовательно, если инициализация отображения производится оператором взятия индекса, то каждый элемент сначала получает значение по умолчанию, а затем ему явно присваивается нужное значение. Если элементы являются объектами класса, у которого инициализация по умолчанию и присваивание значения требуют больших затрат времени, программа будет работать правильно, но недостаточно эффективно.



1 ... 93 94 95 [ 96 ] 97 98 99 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика