--- id: pairs-tuples title: Pairs & Tuples in C++ author: Benjamin Qi, Nathan Wang, Darren Yao, Abutalib Namazov description: Introduces pairs, which allow you to store two objects (possibly of different types) as a single unit, as well as tuples, which are a generalization of pairs. prerequisites: - Bronze - Introduction to Data Structures --- Storing multiple elements as a single unit allows you to change the order of the elements (e.g. sorting) without mixing one component with another. **Example:** Given some points on a plane where the $i$-th point has coordinates $(x_i,y_i)$, sort these points in increasing order of $x$ coordinate and increasing order of $y$ in case there is a tie. If you sort one of $x_i$ and $y_i$ without considering the other, the points will not be in the correct order. We need to consider the pair $(x_i,y_i)$ as a single unit. ## Pairs ### [C++](http://www.cplusplus.com/reference/utility/pair/pair/) - `pair p`: Creates a pair `p` with two elements with the first one being of `type1` and the second one being of `type2`. - `make_pair(a, b)`: Returns a pair with values `a`, `b`. - `{a, b}`: With C++11 and above, this can be used as to create a pair, which is easier to write than `make_pair(a, b)`. - `pair.first`: The first value of the pair. - `pair.second`: The second value of the pair. Example: ```cpp #include using namespace std; int main() { pair myPair1 = make_pair("Testing", 123); cout << myPair1.first << " " << myPair1.second << endl; // Testing 123 myPair1.first = "It is possible to edit pairs after declaring them"; cout << myPair1.first << " " << myPair1.second << endl; pair myPair2 = {"Testing", "curly braces"}; cout << myPair2.first << " " << myPair2.second << endl; // Testing curly braces } /* Output * Testing 123 * Testing curly braces * It is possible to edit pairs after declaring them 123 */ ``` ## [Tuples](http://www.cplusplus.com/reference/tuple/) Of course, we can hold more than two values with something like `pair>`, but it gets messy when you need a lot of elements. In this case, using **tuples** might be more convenient. - `tuple t`: Creates a tuple with `N` elements, i'th one being of `typei`. - `make_tuple(a, b, c, ..., d)`: Returns a tuple with values written in the brackets. - `get(t)`: Returns the $i$'th element of the tuple `t`. Only works for constant $i$. Can be used to change the element of a tuple. Note that it is illegal to do something like the following since $z$ is not constant: ```cpp tuple t{3,4,5}; int z = 1; cout << get(t); ``` - `tie(a, b, c, ..., d) = t`: Equals `a, b, c, ..., d` to the elements of the tuple $t$ accordingly. This is not frequently used by competitive programmers, but it is good to know and can help simplify things sometimes. Example: ```cpp #include #include /// needs additional library #include using namespace std; int main() { int a = 3, b = 4, c = 5; tuple t = tie(a, b, c); cout << get<0>(t) << " " << get<1>(t) << " " << get<2>(t) << endl; get<0>(t) = 7; cout << get<0>(t) << " " << get<1>(t) << " " << get<2>(t) << endl; tuple tp2 = make_tuple("Hello", "world", 100); string s1, s2; int x; tie(s1, s2, x) = tp2; cout << s1 << " " << s2 << " " << x << endl; } /* Output * 3 4 5 * 7 4 5 * Hello world 100 */ ``` ## Sorting Pairs & Tuples By default, C++ pairs are sorted by first element and then second element in case of a tie, which is precisely what we need for the example above. ```cpp pair arr[N]; int main() { sort(arr, arr+N); // example values? } ``` Tuples are sorted similarly.