Читать «C++: базовый курс» онлайн - страница 315

Herbert Schildt

В общем случае любой объект, используемый в качестве ключа, должен определять конструктор по умолчанию и перегружать оператор "<" (а также другие необходимые операторы сравнения). Эти требования для разных компиляторов различны.

Для класса map определены следующие операторы сравнения:

==, <, <=, !=, > и >=

Функции-члены, определенные для класса map, представлены в табл. 21.4. В их описании под элементом key_type понимается тип ключа, а под элементом value_type — значение выражения pair<Key, Т>.

Пары "ключ-значение" хранятся в отображении как объекты класса pair, который имеет следующую шаблонную спецификацию.

template <class Ktype, class Vtype>

struct pair {

 typedef Ktype first_type; // тип ключа

 typedef Vtype second_type; // тип значения

 Ktype first; // содержит ключ

 Vtype second; // содержит значение

 // Конструкторы

 pair();

 pair (const Ktype &k, const Vtype &v);

 template<class A, class B> pair(const<A, B> &ob);

}

Как отмечено в комментариях, член first содержит ключ, а член second — значение, соответствующее этому ключу.

Создать пару "ключ-значение" можно либо с помощью конструкторов класса pair, либо путем вызова функции make_pair(), которая создает парный объект на основе типов данных, используемых в качестве параметров. Функция make_pair() — это обобщенная функция, прототип которой имеет следующий вид.

template <class Ktype, class Vtype>

pair<Ktype, Vtype> make_pair(const Ktype &k, const Vtype &v);

Как видите, функция make_pair() возвращает парный объект, состоящий из значений, типы которых заданы параметрами Ktype и Vtype. Преимущество использования функции make_pair() состоит в том, что типы объектов, объединяемых в пару, определяются автоматически компилятором, а не явно задаются программистом.

Возможности использования отображения демонстрируется в следующей программе. В данном случае в отображении сохраняется 10 пар "ключ-значение". Ключом служит символ, а значением — целое число. Пары "ключ-значение" хранятся следующим образом:

А 0

В 1

С 2

и т.д. После сохранения пар в отображении пользователю предлагается ввести ключ (т.е. букву из диапазона А-J), после чего выводится значение, связанное с этим ключом.

// Демонстрация использования простого отображения.

#include <iostream>

#include <map>

using namespace std;

int main()

{

 map<char, int> m;

 int i;

 // Помещаем пары в отображение.

 fоr(i = 0; i <10; i++) {

  m.insert(pair<char, int>('A'+i, i));

 }

 char ch;

 cout << "Введите ключ: ";

 cin >> ch;

 map<char, int>::iterator p;

 // Находим значение по заданному ключу.

 р = m.find(ch);

 if(р != m.end())

  cout << p->second;

 else cout << "Такого ключа в отображении нет.\n";