# 19 General utilities library [utilities]

## 19.4 Pairs [pairs]

### 19.4.3 Specialized algorithms [pairs.spec]

```template<class T1, class T2> constexpr bool operator==(const pair<T1, T2>& x, const pair<T1, T2>& y); ```
Returns: x.first == y.first && x.second == y.second.
```template<class T1, class T2> constexpr bool operator!=(const pair<T1, T2>& x, const pair<T1, T2>& y); ```
Returns: !(x == y).
```template<class T1, class T2> constexpr bool operator<(const pair<T1, T2>& x, const pair<T1, T2>& y); ```
Returns: x.first < y.first || (!(y.first < x.first) && x.second < y.second).
```template<class T1, class T2> constexpr bool operator>(const pair<T1, T2>& x, const pair<T1, T2>& y); ```
Returns: y < x.
```template<class T1, class T2> constexpr bool operator<=(const pair<T1, T2>& x, const pair<T1, T2>& y); ```
Returns: !(y < x).
```template<class T1, class T2> constexpr bool operator>=(const pair<T1, T2>& x, const pair<T1, T2>& y); ```
Returns: !(x < y).
```template<class T1, class T2> void swap(pair<T1, T2>& x, pair<T1, T2>& y) noexcept(noexcept(x.swap(y))); ```
Effects: As if by x.swap(y).
Remarks: This function shall not participate in overload resolution unless is_­swappable_­v<T1> is true and is_­swappable_­v<T2> is true.
```template<class T1, class T2> constexpr pair<V1, V2> make_pair(T1&& x, T2&& y); ```
Returns: pair<V1, V2>(std::forward<T1>(x), std::forward<T2>(y)), where V1 and V2 are determined as follows: Let Ui be decay_­t<Ti> for each Ti.
If Ui is a specialization of reference_­wrapper, then Vi is Ui::type&, otherwise Vi is Ui.
[â€‰Example
:
In place of:
```  return pair<int, double>(5, 3.1415926);   // explicit types
```
a C++ program may contain:
```  return make_pair(5, 3.1415926);           // types are deduced
```
â€”â€‰end example
â€‰]