Нам редко приходится искать какое-то конкретное значение. Чаще нас интересует значение, удовлетворяющее определенным критериям. Мы смогли бы выполнять намного более полезную операцию find, если бы могли определять свои собственные критерии поиска.
Например, мы могли бы найти число, превышающее 42. Мы могли бы также сравнивать строки, не учитывая регистр (верхний или нижний).
Кроме того, мы могли найти первое нечетное число. А может, мы захотели бы найти запись с адресом "17 Cherry Tree Lane".
Стандартный алгоритм поиска в соответствии с критерием, заданным пользователем, называется find_if().
template
In find_if(In first, In last, Pred pred)
{
while (first!=last && !pred(*first)) ++first; return first;
}
Также возможно вы думаете, что такая тема как http://rosprokat23.ru/ никак не связана и даже не тематична с программированием. Хотя, может быть и связана.
В любом случае все-таки зайдите на сайт rosprokat23.ru - там можно узнать много интересного про то, где есть аренда в краснодаре, и сколько стоит аренда в краснодаре.
Что означает вообще аренда в краснодаре, где находится аренда в краснодаре - про это написано на сайте rosprokat23.ru про аренду в краснодаре.
Это важная для многих тема - аренда в краснодаре Спасибо сайту rosprokat23.ru за информацию про аренду в краснодаре
Очевидно (если сравнить исходные коды), что он похож на алгоритм find(), за исключением того, что в нем используется условие !pred(*first), а не *first!=val; иначе говоря, алгоритм останавливает поиск, как только предикат pred() окажется истинным, а не когда будет обнаружен элемент с заданным значением.
V~7i Предикат (predicate) — это функция, возвращающая значение true или false.
“1 Очевидно, что алгоритм find_if() требует предиката, принимающего один аргумент, чтобы выражение pred(*first) было корректным. Мы можем без труда написать предикат, проверяющий какое-то свойство значения, например “содержит ли строка букву х”, “превышает ли число значение 42” или “является ли число нечетным?” Например, мы можем найти первое нечетное число в целочисленном векторе.
bool odd(int x) { return x%2; } // % — деление по модулю void f(vector& v)
{
vector::iterator p = find_if(v.begin(), v.end(), odd); if (p!=v.end()) { /* мы нашли нечетное число */ }
// . . .
}
При данном вызове алгоритм find_if() применит функцию odd() к каждому элементу, пока не найдет первое нечетное число. Аналогично, мы можем найти первый элемент списка, значение которого превышает 42.
bool larger_than_42(double x) { return x>42; } void f(list& v)
{
list::iterator p = find_if(v.begin(), v.end(),
larger_than_42); if (p!=v.end()) { /* мы нашли значение, превышающее 4 2 */ }
// . . .
}
Однако последний пример не вполне удовлетворительный. А что, если мы после этого захотим найти элемент, который больше 41? Нам придется написать новую функцию. Хотите найти элемент, который больше 19? Пишите еще одну функцию. Должен быть более удобный способ!
Если мы хотим сравнивать элемент с произвольным значением v, то должны как- то сделать это значение неявным аргументом предиката алгоритма find_if(). Мы могли бы попробовать (выбрав в качестве удобного имени идентификатор v_val).
double v_val; // значение, с которым предикат larger_than_v()
// сравнивает свой аргумент bool larger_than_v(double x) { return x>v_val; }
void f(list& v, int x)
{
v_val = 31; // устанавливаем переменную v_val равной 31,
// для следующего вызова предиката larger_than_v list::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::iterator q = find_if(v.begin(), v.end(),
larger_than_v); if (q!=v.end()) { /* мы нашли значение, превышающее x*/ }
// . . .
}
Почему такое использование переменной v вызывает у нас такое отвращение? Назовите по крайней мере три способа, которые приведут к непонятным ошибкам. Назовите три приложения, в которых такие программы особенно недопустимы.
Опубликовал katy
April 22 2015 22:24:58 ·
0 Комментариев ·
3680 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.