printSTL

printВспомогательные компоненты

В заголовочном файле <utility> определены шаблоны функций для operator!= из operator== и operator>, <=, >= из operator< (для использования шаблонов написать using namespace std::rel_ops;).
Также <utility> включает шаблон класса для разнородных пар значений pair<T1,T2>. Для этого типа определены операции == и <. Для создания пары используется функция make_pair(5, 3.1415926).
Класс tuple (кортеж) является аналогом pair для неограниченного числа значений и определен в <tuple>. Для доступа к элементам кортежа используется функция std::get<`i`> (нумерация с 0). Для извлечения всех значений из кортежа используется функция tie (для ненужных полей указывается ignore). Для создания кортежа используется функции make_tuple и forward_as_tuple (кортеж из ссылок на временные значения). Функция tuple_cat позволяет соединить несколько кортежей в один.
tuple<int,char,double> t1(10,'x',1.0),t2;
get<0>(t2)=get<0>(t1);
t2=make_tuple(1,'b',2.0);
int x;
double y;
tie(x,ignore,y)=t2;
print(forward_as_tuple("Name"s,10)); 
...
void print(tuple<std::string&&,int&&> arg)
{ cout<<get<0>(arg)<<" "<<get<1>(arg)<<"\n";
}

Функциональные объекты – это объекты, для которых определён operator(). Они важны для эффективного использования библиотеки. В местах, где ожидается передача указателя на функцию алгоритмическому шаблону, интерфейс установлен на приём объекта с определённым operator(). Это не только заставляет алгоритмические шаблоны работать с указателями на функции, но также позволяет им работать с произвольными функциональными объектами. Использование функциональных объектов вместе с шаблонами функций увеличивает выразительную мощность библиотеки также, как делает результирующий код более эффективным. Например, если мы хотим поэлементно сложить два вектора a и b, содержащие double, и поместить результат в a, мы можем сделать это так:
transform(a.begin(), a.end(), b.begin(), a.begin(), plus<double>());
В заголовочном файле <functional> определены функционалы plus, minus, times, divides, modulus, negate, equal_to, not_equal_to, less, greater, less_equal, greater_equal, logical_or, logical_and, logical_not. Пользователь может производить свои функционалы, наследуя от unary_function<TArg, TRez> и binary_function<TArg1, TArg2, Trez> и определяя operator(). Можно превращать бинарные функционалы в унарные с помощью связывателей bind1st и bind2nd, заменяющих соответствующий аргумент на константу: bind2nd(less<int>(),40) (значение меньше 40).
В современном С++ для решения подобных задач чаще используются лямбда-выражения
loading