// Тип объекта унарной функции, вызываемой алгоритмом for_each
template ctypename elementType>
struct DisplayElementKeepCount
{
int Count;
1 1 :
// Конструктор
DisplayElementKeepCount (): Count (0) {}
void operator () (const elementType& element)
{
++ Count;
cout « element « ' ';
}
20: };
2 1 :
int main ()
{
■ vector veclntegers;
for (int nCount = 0; nCount < 10; ++ nCount)
veclntegers.push_back (nCount);
27:
cout « "Displaying the vector of integers: " « endl;
// Отобразить массив целых чисел
DisplayElementKeepCount Functor =
for_each ( veclntegers.begin () //Начало диапазона
33: , veclntegers.end () // Конец диапазона
, DisplayElementKeepCount () );// Функтор
cout « endl;
36:
// Использование состояния, хранимого в возвращаемом значении
// алгоритма for_each!
38: cout « "'" « Functor.Count « "' elements were displayed"
endl;
39:
string Sample ("for_each and strings!");
41: cout « "String: " « Sample « ", length: " « Sample.length()
endl;
42:
cout « "String displayed using lambda:" « endl;
int NumChars = 0;
for_each ( Sample.begin()
, Sample.end ()
47: , [&NumChars](char c) { cout « c « ' '; ++NumChars; } );
528 ЗАНЯТИЕ 23. Алгоритмы библиотеки STL
48:
cout « endl;
50:
|
cout «
|
" « NumChars «
|
characters were displayed" « endl;
|
51:
|
return
|
0;
|
|
52:
|
|
53:
|
}
|
|
|
Результат
Displaying the vector of integers:
0123456789
'10' elements were displayed
String: for_each and strings!, length: 21
String displayed using lambda:
f o r _ e a c h a n d s t r i n g s !
'21' characters were displayed
Анализ
Пример кода демонстрирует удобство алгоритма f o r _ e a c h (), а также его способность возвратить объект функции R e s u lt, разработанный так, чтобы содержать такую инфор мацию, как количество его вызовов. В коде используются два примера диапазонов: один, содержавшийся в векторе целых чисел v e c l n t e g e r s , а другой, S am ple, — объект клас
са s t d : : s t r i n g . Код вызывает функцию f o r _ e a c h () для этих диапазонов в строках 32 и 45 соответственно. В первый раз с использованием унарного предиката D is p la y E le - m entK eepC ount, а второй — лямбда-выражения. Для каждого элемента в заданном диа пазоне алгоритм f o r e a c h () вызывает оператор o p e r a t o r (), который в свою очередь
выводит элемент на экран и увеличивает значение внутреннего счетчика. Когда функция f o r e a c h () завершает работу, возвращается объект функции, а ее член C ount сообщает количество использований объекта. Этот способ хранения информации (или состояния) в объекте, который возвращается алгоритмом, может быть весьма полезен в практических
ситуациях. Алгоритм f o r _ e a c h () в строке 45 делает для объекта класса s t d : : s t r i n g то же самое, что и его аналог в строке 32, но с использованием лямбда-выражения вместо объекта функции.
Do'stlaringiz bilan baham: |