auto iElementFound = find
|
( veclntegers.cbegin ()
|
// Начало
|
диапазона
|
|
|
, veclntegers.cend ()
|
// Конец диапазона
|
// Проверить
|
успех поиска
|
, NumToFind
|
);
|
// Искомый
|
элемент
|
|
|
|
|
if ( iElementFound != veclntegers.cend ())
|
|
|
cout «
|
"Result: Value
|
found!" «
|
endl;
|
|
|
Алгоритм f i n d _ i f () похож на f in d (), но требует предоставления унарного предика та (унарной функции, возвращающей значение t r u e или f a l s e ) как третьего параметра.
auto iEvenNumber = find_if ( veclntegers.cbegin () // Начало диапазона , veclntegers.cend () // Конец диапазона
, [](int element) { return (element % 2) == 0; } );
if (iEvenNumber != veclntegers.cend ())
cout « "Result: Value found!" « endl;
Таким образом, обе функции поиска возвращают итератор, который необходимо срав нить с результатом метода en d () или ce n d () контейнера, чтобы проверить успех опера ции поиска. Если проверка прошла успешно, можете использовать этот итератор далее. В листинге 23.1 показано применение функции f i n d ( ) для поиска значения в векторе и функции f in d i f () для поиска первого четного числа.
Л И С ТИ Н Г 2 3 .1 . Использование функции find() для поиска значения в векторе и функции find_if () для поиска первого четного числа
по заданному унарному предикату в лямбда-выражении______________________________________
#include
#include
#include
3:
: int main ()
{
using namespace std;
vector veclntegers;
:
// Вставка примеров значений от -9 до 9
10:
|
for (int SampleValue = -9;SampleValue
|
< 10; ++ SampleValue)
|
11:
|
veclntegers.push_back (SampleValue);
|
1 2 :
518 ЗАНЯТИЕ 23. Алгоритмы библиотеки STL
cout « "Enter number to find in collection: ";
int NumToFind = 0;
cin » NumToFind;
16:
auto iElementFound = find ( veclntegers.cbegin () // Начало
// диапазона
18: , veclntegers.cend () // Конец
// диапазона
19: , NumToFind ); // Искомый элемент
2 0 :
// Проверить успех поиска
if ( iElementFound != veclntegers.cend ())
23: cout « "Result: Value " « *iElementFound « " found!"
endl;
else
25: cout « "Result: No element contains value " « NumToFind
endl;
26:
cout « "Finding the first even number using find_if: " « endl;
auto iEvenNumber = find_if ( veclntegers.cbegin () // Начало
// диапазона
30: , veclntegers.cend () // Конец
// диапазона
31: , [](int element) { return (element % 2) == 0; } );
32:
if (iEvenNumber != veclntegers.cend ())
{
35: cout « "Number '" « *iEvenNumber
"' found at position [";
cout « distance (veclntegers.cbegin (), iEvenNumber);
cout « "]" « endl;
}
39:
return 0;
}
Результат
Enter number to find in collection: 7
Result: Value 7 found!
Finding the first even number using find_if: Number '-8' found at position [1] Следующий запуск:
Enter number to find in collection: 2011
Result: No element contains value 2011
Finding the first even number using find_if:
Number '-8' found at position [1]
Анализ
Функция m ain () начинается с создания вектора целых чисел, инициализированного
значениями в диапазоне от - 9 до 9. Алгоритм f i n d () в строках 17-19 используется для
Использование алгоритмов STL
|
519
|
поиска введенного пользователем числа. Использование алгоритма f i n d _ i f () для поис ка первого четного числа в заданном диапазоне представлено в строках 29-31. Строка 31 является унарным предикатом, созданным как лямбда-выражение. Это лямбда-выражение возвращает значение tr u e , когда элемент делится на 2.
ВНИМАНИЕ!
В листинге 23.1 всегда проверяется допустимость итератора, возвращенного функцией find() или find_if (). Эту проверку никогда не следует пропу скать, поскольку успех операции find() никогда нельзя считать само собой разумеющимся.
СОВЕТ
В листинге 17.5 (см. занятие 17, “Классы динамических массивов библиотеки STL”) также показано использование алгоритма std::distance () для опре деления смещения найденного элемента от начала вектора (строка 21).
Подсчет элементов по заданному значению или условию
Алгоритмы s t d : : c o u n t () и c o u n t _ if () помогают при подсчете элементов заданно го диапазона. Алгоритм s t d : : f i n d () позволяет подсчитать количество элементов, кото рые соответствуют заданному значению (для проверки используется оператор равенства o p e ra to r= = ):
size_t nNumZeroes = count (veclntegers.begin (),veclntegers.end 0,0); cout « "Number of instances of 'O': " « nNumZeroes « endl « endl;
Алгоритм s t d : : c o u n t _ i f () позволяет подсчитать количество элементов, которые удовлетворяют унарному предикату, переданному как параметр (это может быть объект функции или лямбда-выражение):
// Унарный предикат:
template
bool IsEven (const elementType& number)
{
return ((number % 2) == 0); // true, если четное
}
Использование алгоритма count_if с унарным предикатом IsEven: size_t nNumEvenElements = count_if (veclntegers.begin (),
veclntegers.end (), IsEven );
cout « "Number of even elements: " « nNumEvenElements « endl;
Применение этих функций показано в коде листинга 23.2.
И С ТИ Н Г 2 3 .2 . Применение функции std:: count () для определения количества элементов с указанны м значением и функции count_if () для
определения количества элементов, удовлетворяющих условию______________________________
#include
#include
Do'stlaringiz bilan baham: |