До сих пор каждая переменная хранила одно значение: число, символ, строку. Но то, что описывает программа, часто состоит из нескольких значений сразу. У ребёнка в шеренге есть имя и рост. У точки на плоскости есть x и y. У книги есть название, год и число страниц. Этот урок о том, как держать такие значения вместе, в одной переменной, чтобы их нельзя было случайно разлучить.
Зачем связывать значения
Пусть у нас есть имена и рост детей в классе, и нужно найти самого высокого — имя и рост. С тем, что вы уже знаете, вы бы прочитали их в два вектора:
Их связывает только индекс: names[3] относится к heights[3]. Это работает,
пока ничего не двигается. Отсортируйте heights — и каждое имя теперь указывает
не на то число; поменяйте местами двух детей в одном векторе и забудьте про
другой — и данные незаметно испорчены навсегда. Решение — сделать из двух
значений одно.
pair: два значения в одной переменной
pair (пара) хранит ровно два значения, и у них могут быть разные типы. Две
половины называются first и second:

Ту же пару можно записать в одну строку, одним из двух способов. Фигурные
скобки короче; make_pair вы встретите в старом коде. Смысл один и тот же:
cout не умеет печатать пару, а cin — читать её, поэтому половины печатают и
читают по отдельности: cin >> p.first >> p.second;. swap из недели 7
работает и с парами: swap(p.first, p.second) меняет местами две половины
одной пары, а swap(p, q) — две пары целиком.
Вектор пар
По-настоящему пары полезны, когда их много. Один vector<pair<string, int>>
хранит весь класс, и имя никогда не оторвётся от роста:
kids[i] — один ребёнок; kids[i].second — его рост. Поиск самого высокого —
это цикл поиска максимума из недели 4, только сравнивается .second, а
печатается .first:
