Структура pair

Иногда удобно в одной переменной хранить одновременно два значения, например, два целых числа. Например, координаты точки на плоскости удобно хранить в одной переменной, содержащих два числа: x-координату и y-координату. Для этого в STL есть шаблон pair (пара), особенно удобно использовать pair для сортировки объектов.

Pair является переменной, объединяющей в себе два значения, которые могут быть одного или разных типов. Например, чтобы создать переменную типа pair, содержащую два поля типа int нужно использовать следующее объявление:

pair <int, int> a;

Теперь переменная a будет хранить в себе два значения типа int. Получить доступ к первому значению можно при помощи записи a.first, а ко второму значению — a.second, они называются полями переменной. Каждому полю можно присваивать независимые значения, например, так:

a.first = 1;
a.second = 2;

Присвоить одновременно два значения обоим полям пары можно при помощи функции make_pair, принимающующей два аргумента и возвращающей значение типа pair с соответствующими полями:

a = make_pair(1, 2);

Между тем с переменной типа pair можно работать и как с единым целым, например, если объявить две переменные типа pair с одинаковыми типами полей, то можно одной переменной присвоить значение другой переменной:

pair <int, int> a, b;
...
b = a;

Но при вводе-выводе переменных, типа pair нельзя выводить или вводить значение переменной одной командой, то есть нельзя сразу же вывести два значения типа:

cin >> a;
cout << a;

Вместо этого нужно отдельно считывать или выводить каждое поле пары.

Можно создавать пару с полями разных типов, например, чтобы поле first имело тип double, а поле second — string, нужно использовать запись pair <double, string>.

С парой, как с целым (то есть одновременно с двумя полями структуры) можно выполнять следующие операции: =, ==, !=, <, <=, >, >=, а также использовать в качестве аргумента функции swap. При использовании операций сравнения (типа меньше, больше и т.д.) пары сравниваются в лексикографическом порядке, то есть сначала по полю first, а если поля first равны, то по полю second.

Вектор, составленный из структур pair можно сортировать, при этом используется сравнение типа <, то есть пары упорядочиваются по первому полю, затем — по второму полю. Объявить вектор из пар можно следующим образом:

vector < pair< int, int> > a

Обратите внимание на пробел между закрывающими угловыми скобками: он обязателен, иначе компилятор будет считать это операцией “>>