Программирование. Принципы и практика использования C++ Исправленное издание, стр. 288
Кроме того, мы могли найти первое нечетное число. А может, мы захотели бы найти запись с адресом "
17 Cherry Tree LaneСтандартный алгоритм поиска в соответствии с критерием, заданным пользователем, называется
find_if()template<class In,class Pred>In find_if(In first,In last,Pred pred){ while (first!=last && !pred(*first)) ++first; return first;}Очевидно (если сравнить исходные коды), что он похож на алгоритм
find()!pred(*first)*first!=valpred()
truefalsefind_if()pred(*first)bool odd(int x) { return x%2; } // % — деление по модулюvoid f(vector<int>& v){ vector<int>::iterator p = find_if(v.begin(), v.end(), odd); if (p!=v.end()) { /* мы нашли нечетное число */ } // ...}При данном вызове алгоритм
find_if()odd()bool larger_than_42(double x) { return x>42; }void f(list<double>& v){ list<double>::iterator p = find_if(v.begin(), v.end(), larger_than_42); if (p!=v.end()) { /* мы нашли значение, превышающее 42 */ } // ...}Однако последний пример не вполне удовлетворительный. А что, если мы после этого захотим найти элемент, который больше 41? Нам придется написать новую функцию. Хотите найти элемент, который больше 19? Пишите еще одну функцию. Должен быть более удобный способ!
Если мы хотим сравнивать элемент с произвольным значением
vfind_if()v_valdouble v_val; // значение, с которым предикат larger_than_v() // сравнивает свой аргументbool larger_than_v(double x) { return x>v_val; }void f(list<double>& v,int x){ v_val = 31; // устанавливаем переменную v_val равной 31, // для следующего вызова предиката larger_than_v list<double>::iterator p = find_if(v.begin(),v.end(), larger_than_v); if (p!=v.end()) { /* мы нашли значение, превышающее 31 */ } v_val = x; // устанавливаем переменную v_val равной x // для следующего вызова предиката larger_than_v list<double>::iterator q = find_if(v.begin(), v.end(), larger_than_v); if (q!=v.end()) { /* мы нашли значение, превышающее x*/ } // ...}
ПОПРОБУЙТЕ
Почему такое использование переменной
v21.4. Объекты-функции
Итак, мы хотим передавать предикат алгоритму
find_if()void f(list<double>& v, int x){ list<double>::iterator p = find_if(v.begin(), v.end(), Larger_than(31)); if (p!=v.end()) { /* мы нашли число, превышающее 31 */ } list<double>::iterator q = find_if(v.begin(), v.end(), Larger_than(x)); if (q!=v.end()) { /* мы нашли число, превышающее x */ } // ...}Очевидно, что функция
Larger_than