#include
#include
using namespace std;
// Сюда вставить структуру IsMultiple из листинга 21.3
int main ()
6 : {
vector veclntegers;
cout << "The vector contains the following sample values: ";
// Вставить примеры значений: 25 - 31
11: for (int nCount = 25; nCount < 32; ++ nCount)
12: {
veclntegers.push_back (nCount);
cout << nCount << ' ';
}
cout << endl << "Enter divisor (> 0): ";
17: int Divisor = 2 ; ,
cin >> Divisor;
// Найти в коллекции первый элемент,кратный 4
auto iElement = find_if ( eclntegers.begin ()
22:
|
,veclntegers.end ()
|
23:
|
, IsMultiple(Divisor) );
|
492 ЗАНЯТИЕ 21. Понятие объектов функций
24:
if(iElement != veclntegers.end ())
{
cout << "First element in vector divisible by " << Divisor;
cout << ": " << *iElement << endl;
}
30:
return 0;
}
Результат
The vector contains the following sample values: 25 26 27 28 29 30 31
The first element in the vector that is divisible by 4 is: 28
Анализ
Пример начинается с простого контейнера — вектора целых чисел. В строках 11-15
он заполняется примерами чисел. П рименение унарного предиката осущ ествляет ся в алгоритме поиска f i n d _ i f (), как показано в строке 23. Объект функции IsM u l-t i p l e ( ) инициализируется предоставляемым пользователем значением делителя, ко торое сохраняется в переменной D iv is o r . Алгоритм f i n d _ i f () вызывает оператор
I s M u l t i p l e : : o p e r a t o r () унарного предиката для каждого элемента в определенном диапазоне. Когда оператор o p e r a to r () возвращает для элемента значение t r u e (что про
исходит, когда он делится на 4 без остатка), алгоритм
|
f i n d i f () возвращ ает итератор
|
iE le m e n t на этот элемент. Результат вызова f i n d _ i f
|
() сравнивается с результатом вы
|
зова метода e n d () контейнера, чтобы удостовериться в успехе поиска элемента (стро
|
ка 25). Затем итератор iE le m e n t используется для отображения значения, как показано в строке 28.
СОВЕТ
Чтобы увидеть, как применение лямбда-выражений повышает компактность
программы, представленной в листинге 21.4, обратите внимание на ли стинг 22.3 занятия 22.
Унарные предикаты применяю тся в больш инстве алгоритмов STL, таких как s t d : : p a r t i t i o n (), позволяю щ их разделить диапазон, с использованием предиката
s t a b l e _ p a r t i t i o n , который делает то же самое при сохранении относительного поряд ка разделенных элементов, а также таких функций поиска, как s t d : : f i n d i f (), и таких функций, как s t d : : r e m o v e _ i f (), позволяющ их удалять удовлетворяющие предикату элементы в определенном диапазоне.
Do'stlaringiz bilan baham: |