Программирование. Принципы и практика использования C++ Исправленное издание, стр. 290
21.4.2. Предикаты на членах класса
Как мы уже видели, стандартные алгоритмы хорошо работают с последовательностями элементов базовых типов, таких как
intdoublestruct Record { string name; // стандартная строка char addr[24]; // старый стиль для согласованности // с базами данных // ...};vector<Record> vr;Иногда мы хотим сортировать вектор
vr// ...sort(vr.begin(),vr.end(),Cmp_by_name()); // сортировка по имени// ...sort(vr.begin(),vr.end(),Cmp_by_addr()); // сортировка по адресу// ...
Cmp_by_nameRecordnamesortCmp_by_name()Cmp_by_namesort()RecordCmp_by_nameCmp_by_addr// разные сравнения объектов класса Record:struct Cmp_by_name { bool operator()(const Record& a,const Record& b) const { return a.name < b.name; }};struct Cmp_by_addr { bool operator()(const Record& a, const Record& b) const { return strncmp(a.addr,b.addr,24) < 0; } // !!!};Класс
Cmp_by_nameoperator()()name<stringCmp_by_addrstrncmp()21.5. Численные алгоритмы
Большинство стандартных алгоритмов из библиотеки STL связаны с обработкой данных: они их копируют, сортируют, выполняют поиск среди них и т.д. В то же время некоторые из них предназначены для вычислений. Они могут оказаться полезными как для решения конкретных задач, так и для демонстрации общих принципов реализации численных алгоритмов в библиотеке STL. Существуют всего четыре таких алгоритма.

Эти алгоритмы определены в заголовке
<numeric>21.5.1. Алгоритм accumulate()
Простейшим и наиболее полезным численным алгоритмом является алгоритм
accumulate()template<class In, class T> T accumulate(In first, In last, T init){ while (first!=last) { init = init + *first; ++first; } return init;}Получив начальное значение
init[first:last]initint a[] = { 1, 2, 3, 4, 5 };cout << accumulate(a, a+sizeof(a)/sizeof(int), 0);Этот фрагмент кода выводит на экран число 15, т.е. 0+1+2+3+4+5 (0 является начальным значением). Очевидно, что алгоритм
accumulate()void f(vector<double>& vd,int* p,int n){ double sum = accumulate(vd.begin(),vd.end(),0.0); int sum2 = accumulate(p,p+n,0);