C++. Сборник рецептов - [90]

Шрифт
Интервал

. Именно это делает пример 6.6. В этом случае отображаемый тип является строкой, но он может быть почти чем угодно.

Отображение объявляется вот так.

>map

> typename Value,  // Тип значения

> typename LessThanFun = std::less, // Функция/функтор,

>                                        // используемые для сортировки

> typename Alloc = std::allocator > // Распределитель памяти

>Key и >Value — это типы ключа и связанного значения, которые хранятся в отображении. >LessThanFun — это функция или функтор, который принимает два аргумента и возвращает истину, если первый меньше, чем второй. По умолчанию используется стандартный функтор >less. >Alloc — это распределитель памяти, и по умолчанию используется стандартный.

Использование >map довольно просто. Объявите тип ключа и значения вот так.

>map strMan;

В результате будет создан >map, в котором и ключ, и значение имеют тип >string. С помощью >operator[] поместите в отображение объекты, что интуитивно и легко читаемо.

>strMap["Monday"] = Montag";

>strMap["Tuesday"] = "Dienstag";

>strMap["Wednesday"] = "Mittwoch"; // ...

В результате в >map будут вставлены элементы с индексом (например, >"Monday") в качестве ключа и правым операндом в качестве значения. Они хранятся в порядке, определяемом параметром шаблона >LessThanFun, и если он не указан, то >map использует >std::less.

Чтобы получить значения из >map, используйте >operator[] в правой части присвоения, как здесь.

>wedInGerman = strMap["Wednesday"];

В манере всех стандартных контейнеров значение, связанное с ключом >"Wednesday", с помощью >operator= копируется в объект >wedInGerman.

>operator[] — это удобный способ вставки или обновления элементов или получения значений из map, но он имеет побочный эффект, который может оказаться неожиданным. Строго говоря, >operator[k] возвращает ссылку на значение, ассоциированное с >k — независимо от того, существует ли >k в >map или нет. Если >k уже находится в >map, то возвращается ассоциированное с ним значение. Если нет, то >k вставляется, а затем используется конструктор по умолчанию, который создает объект значения для этого ключа. Чтобы сделать это более понятным, рассмотрим, что делает следующий код.

>map mapZipCodes;     // Сейчас здесь ноль элементов

>string myZip = mapZipCodes["Tempe"]; // В map пока что нет элементов,

>                                     // но чему теперь равно count()?

Что находится в >myZip и сколько теперь элементов в >mapZipCodes? Так как >operator[] вставляет указанный ключ, если он не существует, >myZip содержит пустую строку, а в >mapZipCodes содержится один элемент. Это может оказаться нежелательно, но независимо от вашего желания помните, что >operator[] не является >const-методом: всегда есть вероятность того, что он изменит состояние >map, добавив узел.

Метод >insert предоставляет альтернативный метод добавления пар в отображение, >insert выполняет строгую вставку, а не вставку/обновление, как >operator[]. При использовании map (но не >multimap, который может содержать дублирующиеся ключи) >insert, если ключ уже существует, не делает ничего. По сравнению с ним >operator[], если ключ уже существует, заменяет значение объекта для этого ключа на новое.

Но синтаксис вставки требует несколько большей работы, чем >operator[], и он связан с тем, как >map хранит данные. Рассмотрим строку из примера 6.6.

>strMap.insert(std::make_pair("Sunday", "Sonntag"));

ma>p хранит пары ключ/значение в объекте >pair, >pair — это простой вспомогательный шаблон класса (объявленный в > и включенный в >), который хранит два значения двух типов. Чтобы объявить >pair из двух >string, сделайте так.

>pair myPair;

Первый и второй элементы в >pair доступны по открытым членам >first и >second. При использовании для доступа к элементам >map оператора >operator[] обычно работать с >pair не приходится, но в случае со многими другими методами это придется делать, так что следует знать, как создавать и использовать объекты >pair. Например, итераторы разыменовываются в простые объекты >pair, так что при их использовании, как это делается в примере 6.6, следует знать, как получить ключ и его значение.

>for (map iterator p = strMap.begin();

> p != strMap.end(); ++p)

> cout << "English: " << p->first

>  << ", German: " << p->second << endl;

Ключ хранится в >first, а значение хранится в >second.

Однако это не объясняет, почему я использовал >make_pair. >make_pair — это вспомогательный шаблон функции, который создает объект >pair на основе двух переданных в него аргументов. Некоторые предпочитают этот подход вызову конструктора >pair, так как шаблон класса не может догадаться о типах своих аргументов, в то время как шаблон функции может. Таким образом, эти две строки кода функционально эквивалентны.

>strMap.insert(std::make_pair("Sunday", "Sonntag"));

>strMap.insert(std::pair("Sunday", "Sonntag"));

>map не допускает наличия дублирующихся ключей. Если требуется разрешить дублирование ключей, следует использовать >multimap, который является >map, разрешающим наличие несколько одинаковых ключей. Его интерфейс идентичен


Рекомендуем почитать
Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


Фундаментальные алгоритмы и структуры данных в Delphi

Книга "Фундаментальные алгоритмы и структуры данных в Delphi" представляет собой уникальное учебное и справочное пособие по наиболее распространенным алгоритмам манипулирования данными, которые зарекомендовали себя как надежные и проверенные многими поколениями программистов. По данным журнала "Delphi Informant" за 2002 год, эта книга была признана сообществом разработчиков прикладных приложений на Delphi как «самая лучшая книга по практическому применению всех версий Delphi».В книге подробно рассматриваются базовые понятия алгоритмов и основополагающие структуры данных, алгоритмы сортировки, поиска, хеширования, синтаксического разбора, сжатия данных, а также многие другие темы, тесно связанные с прикладным программированием.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.


Как пасти котов. Наставление для программистов, руководящих другими программистами

«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.