|
Программирование >> Инициализация объектов класса, структура
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. Следовательно, если инициализация отображения производится оператором взятия индекса, то каждый элемент сначала получает значение по умолчанию, а затем ему явно присваивается нужное значение. Если элементы являются объектами класса, у которого инициализация по умолчанию и присваивание значения требуют больших затрат времени, программа будет работать правильно, но недостаточно эффективно.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |