Чтобы избежать избыточных определений operator!= из operator== и operator›, ‹=, ›= из operator‹, библиотека обеспечивает следующее:
>template ‹class Tl, class T2›
>inline bool operator!=(const T1& x, const T2& y) {
> return !(x == y);
>}
>template ‹class Tl, class T2›
>inline bool operator›(const T1& x, const T2& y) {
> return y ‹ x;
>}
>template ‹class Tl, class T2›
>inline bool operator‹=(const T1& x, const T2& y) {
> return !(y ‹ x);
>}
>template ‹class Tl, class T2›
>inline bool operator›=(const T1& x, const T2& y) {
> return !(x ‹ y);
>}
Библиотека включает шаблоны для разнородных пар значений.
>template ‹class T1, class T2›
>struct pair {
> T1 first;
> T2 second;
> pair() {}
> pair(const T1& x, const T2& y): first(x), second(y) {}
>};
>template ‹class T1, class T2›
>inline bool operator==(const pair‹Tl,T2›& x, const pair‹Tl,T2›& y) {
> return x.first == y.first && x.second == y.second;
>}
>template ‹class T1, class T2›
>inline bool operator‹(const pair‹Tl,T2›& x, const pair‹Tl,T2›& y) {
> return x.first ‹ y.first || (!(y.first ‹ x.first) && x.second ‹ y.second);
>}
Библиотека обеспечивает соответствующую шаблонную функцию make_pair, чтобы упростить конструкцию пар. Вместо выражения, например:
>return pair‹int, double›(5, 3.1415926); // явные типы,
можно написать
>return make_pair(5, 3.1415926); // типы выводятся.
>template ‹class Tl, class T2›
>inline pair‹Tl,T2› make_pair(const T1& x, const T2& y) {
> return pair‹Tl,T2›(x, y);
>}