#include
3:
520 ЗАНЯТИЕ 23. Алгоритмы библиотеки STL
// Унарный предикат для функций *_if
template
bool IsEven (const elementType& number)
/
8
|
return
|
((number
|
% 2) == 0); // true, если четное
|
Q
|
s\
|
|
|
|
|
|
|
10
|
int main
|
()
|
|
|
|
|
11
|
|
|
|
|
12
|
{
|
|
namespace
|
std;
|
|
|
13
|
using
|
|
|
14
|
vector
|
veclntegers;
|
|
|
15
|
cout
|
«
|
"Populating a vector with values from -9 to 9"
|
16
|
17
|
for
|
«
|
endl;
|
-9; nNum < 10; ++ nNum)
|
|
(int nNum =
|
|
18
|
|
veclntegers.push_back
|
(nNum);
|
|
19
|
// Использование
|
алгоритма count для определения количества 'O'
|
20
|
21
|
size
|
t nNumZeroes
|
= count
|
(veclntegers.begin (),
|
22:
|
cout
|
«
|
"Number
|
of
|
|
veclntegers.end
|
0,0);
|
instances of 'O': " «
|
nNumZeroes « endl
|
23
|
|
«
|
endl;
|
|
|
|
|
|
|
|
|
|
|
|
// Использование алгоритма count if с унарным предикатом IsEven:
size_t nNumEvenElements = count_if (veclntegers.begin () /.
26
|
veclntegers.end (),
|
27
|
IsEven );
|
cout « "Number of even elements: " « nNumEvenElements « endl;
|
28
|
cout « "Number of odd elements: ";
cout « veclntegers.size () - nNumEvenElements « endl;
return 0;
}
Результат
Populating a vector with values from -9 to 9 Number of instances of 'O': 1
Number of even elements: 9
Number of odd elements: 10
Анализ
В строке 21 алгоритм c o u n t () использован для определения количества значений 0 в векторе v e c to r < in t> . Точно так же в строке 25 алгоритм c o u n t i f () использован для определения количества четных чисел в векторе. Обратите внимание на третий параметр, которым является унарный предикат IsE v e n (), определенный в строках 6 -9 . Количество элементов с нечетными значениями в векторе вычисляется при вычитании возвращаемого значения функции c o u n t _ i f () из общего количества содержавшихся в векторе элемен тов, возвращаемого функцией s i z e ().
Использование алгоритмов STL 521
ПРИМЕЧАНИЕ В листинге 23.2 алгоритм count_if () использует функцию предиката IsEv
en (), тогда как в листинге 23.1 используется лямбда-функция, выполняющая
работу функции isEven () в алгоритме find_if ( ) .
Лямбда-версия экономит строки кода, но следует помнить, что если бы два примера были объединены, функция IsEven () была бы применима как в ал горитме find_if (), так и в count_if О ,обеспечивая возможность много кратного использования.
Поиск элемента или диапазона в коллекции
листинге 23.1 продемонстрирована возможность поиска элемента в контейнере. Но иногда необходимо найти диапазон значений или шаблон. В таких ситуациях следует ис
пользовать алгоритм s e a r c h () или s e a r c h _ n (). Алгоритм s e a r c h () применяется для проверки наличия одного диапазона в другом:
auto iRange = search ( veclntegers.begin () // Начало диапазона
, veclntegers.end () // Конец диапазона
// для поиска
listlntegers.begin () // Начало диапазона
для поиска
listlntegers.end () ); // Конец диапазона
для поиска
Алгоритм s e a r c h _ n () применяется для проверки наличия в контейнере л экземпля ров значения, расположенных последовательно:
auto iPartialRange = search_n ( veclntegers.begin () // Начало диапазона
, veclntegers.end () // Конец диапазона
3// Количество искомых элементов
9 ); // Искомый элемент
Обе функции возвращают итератор на первый экземпляр найденной последовательно сти, а перед применением этот итератор следует сравнить с результатом функции en d (). В листинге 23.3 показано применение алгоритмов s e a r c h () и s e a r c h n ().
Л И СТИ Н Г 2 3 .3 . Поиск диапазона в коллекции с использованием
алгоритмов search () и search n ()_________________________________________________
#include
#include
#include
#include
using namespace std;
template ctypename T>
void DisplayContents (const T& Input)
8 : {
for(auto iElement = Input.cbegin() // auto, cbegin и cend: C++11
; iElement != Input.cend()
; ++ iElement )
cout « *iElement « '
13:
522 ЗАНЯТИЕ 23. Алгоритмы библиотеки STL
cout « endl;
int main ()
{
// Пример контейнера (вектор целых чисел, содержащий // значения от -9 до 9)
2 0 : vector veclntegers;
2 1 : for (int nNum = -9; nNum < 10; ++ nNum)
veclntegers.push_back (nNum);
// Вставить в вектор еще несколько примеров значений
veclntegers.push_back (9);
veclntegers.push_back (9);
27:
// Еще один пример контейнера (список целых чисел от -4 до 4)
list listlntegers;
for (int nNum = -4; nNum <5; ++ nNum)
listlntegers.push_back (nNum);
32:
cout « "The contents of the sample vector are: " « endl;
DisplayContents (veclntegers);
35:
cout « "The contents of the sample list are: " « endl;
DisplayContents (listlntegers);
38:
cout « "search() for the contents of list in vector:" « endl;
40:
|
auto iRange = search ( veclntegers.begin
|
()
|
// Начало диапазона
|
41:
|
, veclntegers.end ()
|
|
// Конец диапазона
|
42:
|
, listlntegers.begin
|
()
|
// для поиска
|
// Начало диапазона
|
43:
|
, listlntegers.end
|
()
|
);
|
// для поиска
|
// Конец диапазона
|
44:
|
|
|
|
// для поиска
|
|
|
|
|
// Проверка успеха поиска
if (iRange != veclntegers.end О)
{
cout « "Sequence in list found in vector at position: ";
cout « distance (veclntegers.begin (), iRange) « endl;
}
51:
52: cout « "Searching {9, 9, 9} in vector using search_n(): "
endl;
auto iPartialRange = search_n ( veclntegers.begin () // Начало
54:
|
, veclntegers.end
|
//
|
диапазона
|
() //
|
Конец диапазона
|
55:
|
, 3
|
//
|
Количество искомых элементов
|
56:
|
,9);
|
//
|
Искомый
|
элемент
|
57:
|
|
|
|
|
|
Do'stlaringiz bilan baham: |