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

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

, но поведение методов в необходимых случаях отличается. В табл. 6.1 приведен перечень методов, которые есть в одном, но отсутствуют в другом, и пояснения различий в поведении общих методов, map и >multimap содержат несколько >typedef, которые описывают различные значения, хранящиеся в них. В табл. 6.1 они используются следующим образом:

>key_type

Это тип ключа. В >string map, объявленном как >map, >key_type должен быть >string.

>mapped_type

Это тип значения, на которое отображается ключ. В >string map, объявленном как >map, >mapped_type должен быть >MyClass*.

>value_type

Это тип объекта, содержащего ключ и значение, которой, применительно к >map и >multimap, является >pair.


Табл. 6.1. map и multimap

Методmap, multimap или обаПоведение
>T& operator[] (const key_type& k)>mapВозвращает ссылку на объект значения, сохраненный с ключом >k. Если >k в map отсутствует, то он добавляется, а объект значения создается с помощью конструктора по умолчанию
>iterator insert(const value_type& v) pair insert(const value_type& v)ОбаПервая версия вставляет >v в >multimap и возвращает итератор, который указывает на вставленную пару >pair. Вторая версия вставляет >v и >map при условии, что в >map еще не содержится ключа, равного >v. Возвращаемая >pair содержит итератор который указывает на вставленную >pair, если произошла вставка, и >bool, указывающий, была ли вставка успешной
>iterator find(const key_type& k)ОбаВозвращает итератор или >const_iterator, который указывает на> mapped_type, соответствующий >k. В >multimap не гарантируется, что возвращаемый итератор будет указывать на первое значение, соответствующее >k. Если ключа, равного k, нет, то возвращаемый итератор равен >end()

Также табл 6.1 показывает разницу в поведении между >map и >multimap.

Если >operator[] вам не подходит, т.е. другой способ найти ключ в >map. Для этого можно использовать метод >find.

>map::const_iterator p

> = strMap.find("Thursday");


>if (p != strMap.end())

> cout << "Thursday = " << p->second << endl;

Но не забудьте, что при использовании >multimap не гарантируется, что возвращаемый элемент будет первым элементом с ключом, равным искомому. Если нужен первый элемент, чей ключ не меньше определенного значения или не больше определенного значения, используйте >lower_bound или >upper_bound. >lower_bound возвращает итератор, указывающий на первую пару ключ/значение, равную или большую, чем аргумент >key_type. Другими словами, если ваш >map содержит дни недели, как в примере 6.6, следующий код вернет итератор, который указывает на пару, содержащую >"Friday" и >"Freitag".

>p = strMap.lower_bound("Foo");

>if (p != strMap.end())

> cout << p->first << " = " << p->second << endl;

Это происходит благодаря тому, что первый ключ больше или равен >"Foo". >upper_bound работает аналогично, но с противоположным условием.

В начале этого обсуждения я упоминал, что элементы в map хранятся в отсортированном по ключам порядке, так что при переборе от >begin до >end каждый элемент будет «больше», чем предшествующий (а в >multimap — больше или равен ему) Но при использовании более сложных ключей, чем >string или числа, может потребоваться указать, как при вставке элементов в отображение следует сравнивать ключи.

По умолчанию ключи хранятся с помощью стандартного функтора >less (объявленного в >). >less — это двоичная функция (принимает два аргумента одинакового типа), которая возвращает >bool, указывающий на то, больше ли первый аргумент, чем второй, или нет. Другими словами, >less(a, b) возвращает >a < b. Если это не то, что вам требуется, создайте свой собственный функтор и объявите >map с его помощью. Например, если в качестве ключа используется объект >Person и каждый >Person имеет имя и фамилию, то может потребоваться сравнивать фамилии и имена. Пример 6.7 показывает способ сделать это.

Пример 6.7. Использование собственного функтора сортировки

>#include

>#include

>#include


>using namespace std;


>class Person {

> friend class PersonLessThan;

>public:

> Person(const string& first, const string& last) :

>  lastName_(last), firstName_(first) {}

> // ...

> string getFirstName() const {return(firstName_);}

> string getLastName() const {return(lastName_);}

>private:

> string lastName_;

> string firstName_;

>};


>class PersonLessThan {

>public:

> bool operator()(const Person& per1,

>  const Person& per2) const {

>  if (per1.lastName_ < per2. lastName_)      // Сравнить фамилии,

>   return(true);                             // а затем

>  else if (per1.lastName_ == per2.lastName_) // имена

>   return(per1.firstName_ < per2.firstName_);

>  else

>   return(false);

> }

>};


>int main() {

> map personMap;

> Person per1("Billy", "Silly"),

>  per2("Johnny", "Goofball"),

>  per3("Frank", "Stank"),

>  реr4("Albert", "Goofball");

> personMap[per1] = "cool";

> personMap[per2] = "not cool";

> personMap[per3] = "not cool";

> personMap[per4] = "cool";

> for (map::const_iterator p =

>  personMap.begin(); p != personMap.end(); ++p) {

>  cout << p->first.getFirstName() << " " << p->first.getLastName()


Рекомендуем почитать
Изучаем 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-проектами. Программист подобен кошке, которая гуляет сама по себе. Так уж исторически сложилось. Именно поэтому так непросто быть руководителем команды разработчиков. Даже если вы еще месяц назад были блестящим и дисциплинированным программистом и вдруг оказались в роли менеджера, вряд ли вы знаете, с чего надо начать, какой выбрать стиль руководства, как нанимать и увольнять сотрудников, проводить совещания, добиваться своевременного выполнения задач.