inline void advance(InputIterator& i, Distance n);
template ‹class InputIterator, class Distance›
inline void distance(InputIterator first, InputIterator last, Distance& n);
distance должна быть функцией 3-х параметров, сохраняющей результат в ссылке вместо возвращения результата, потому что тип расстояния не может быть выведен из встроенных итераторных типов, таких как int*.
Функциональные
объекты
Функциональные объекты - это объекты, для которых определён operator. Они важны для эффективного использования библиотеки. В местах, где ожидается передача указателя на функцию алгоритмическому шаблону, интерфейс установлен на приём объекта с определённым operator. Это не только заставляет алгоритмические шаблоны работать с указателями на функции, но также позволяет им работать с произвольными функциональными объектами. Использование функциональных объектов вместе с функциональными шаблонами увеличивает выразительную мощность библиотеки также, как делает результирующий код более эффективным. Например, если мы хотим поэлементно сложить два вектора a и b, содержащие double, и поместить результат в a, мы можем сделать зто так:
Соответствующие функции вставят сложение и отрицание.
Чтобы позволить адаптерам и другим компонентам манипулировать функциональными объектами, которые используют один или два параметра, требуется, чтобы они соответственно обеспечили определение типов (typedefs) argument_type и result_type для функциональных объектов, которые используют один параметр, и first_argument_type, second_argument_type и result_type для функциональных объектов, которые используют два параметра.
Базовые классы (Base)
Следующие классы предоставляются, чтобы упростить определение типов (typedefs) параметров и результата:
template ‹class Arg, class Result›
struct unary_function {
typedef Arg argument_type;
typedef Result result_type;
};
template ‹class Arg1, class Arg2, class Result›
struct binary_function {
typedef Arg1 first_argument_type;
typedef Arg2 second_argument_type;
typedef Result result_type;
};
Арифметические операции (Arithmetic operations)
Библиотека обеспечивает базовые классы функциональных объектов для всех арифметических операторов языка.
template ‹class T›
struct plus: binary_function‹T, T, T› {
Т operator(const T& x, const T& y) const {return x + y;}
};
template ‹class T›
struct minus: binary_function‹T, T, T› {
Т operator(const T& x, const T& y) const {return x - y;}
};
template ‹class T›
struct times: binary_function‹T, T, T› {
Т operator(const T& x, const T& y) const (return x * y;}
};
template ‹class T›
struct divides: binary_function‹T, T, T› {
Т operator(const T& x, const T& y) const {return x / y;}
};
template ‹class T›
struct modulus: binary_function‹T, T, T› {
Т operator(const T& x, const T& y) const {return x % y;}
};
template ‹class T›
struct negate: unary_function‹T, T› {
Т operator(const T& x) const {return -x;}
};
Сравнения (Comparisons)
Библиотека
обеспечивает базовые классы функциональных объектов для всех операторов сравнения языка