C++. Сборник рецептов - [90]
Отображение объявляется вот так.
>map
> typename Value, // Тип значения
> typename LessThanFun = std::less
> // используемые для сортировки
> typename Alloc = std::allocator
>Key
и >Value
— это типы ключа и связанного значения, которые хранятся в отображении. >LessThanFun
— это функция или функтор, который принимает два аргумента и возвращает истину, если первый меньше, чем второй. По умолчанию используется стандартный функтор >less
. >Alloc
— это распределитель памяти, и по умолчанию используется стандартный.
Использование >map
довольно просто. Объявите тип ключа и значения вот так.
>map
В результате будет создан >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
>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
Первый и второй элементы в >pair
доступны по открытым членам >first
и >second
. При использовании для доступа к элементам >map
оператора >operator[]
обычно работать с >pair
не приходится, но в случае со многими другими методами это придется делать, так что следует знать, как создавать и использовать объекты >pair
. Например, итераторы разыменовываются в простые объекты >pair
, так что при их использовании, как это делается в примере 6.6, следует знать, как получить ключ и его значение.
>for (map
> 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
>map
не допускает наличия дублирующихся ключей. Если требуется разрешить дублирование ключей, следует использовать >multimap
, который является >map
, разрешающим наличие несколько одинаковых ключей. Его интерфейс идентичен
Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
Книга "Фундаментальные алгоритмы и структуры данных в Delphi" представляет собой уникальное учебное и справочное пособие по наиболее распространенным алгоритмам манипулирования данными, которые зарекомендовали себя как надежные и проверенные многими поколениями программистов. По данным журнала "Delphi Informant" за 2002 год, эта книга была признана сообществом разработчиков прикладных приложений на Delphi как «самая лучшая книга по практическому применению всех версий Delphi».В книге подробно рассматриваются базовые понятия алгоритмов и основополагающие структуры данных, алгоритмы сортировки, поиска, хеширования, синтаксического разбора, сжатия данных, а также многие другие темы, тесно связанные с прикладным программированием.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.
«Как пасти котов» – это книга о лидерстве и руководстве, о том, как первое совмещать со вторым. Это, если хотите, словарь трудных случаев управления IT-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.