C++ за 21 день седьмое издание



Download 1,38 Mb.
bet341/437
Sana22.02.2022
Hajmi1,38 Mb.
#89455
TuriРеферат
1   ...   337   338   339   340   341   342   343   344   ...   437
Bog'liq
word1

template

elementType & element)

void FuncDisplayElement

(const

{

<<

' ';




cout << element




};










Функция F u n c D is p la y E le m e n t ()

получает один параметр шаблонного типа e l e ­

m en tT y p e, отображаемый на консоли с использованием оператора s t d : :c o u t . Та же функция может иметь и другое представление, в котором реализация функции фактически содержится оператором o p e r a t o r () класса или структуры:



Типичные приложения объектов функций

487




  1. Структура, способная вести себя как унарная функция template

struct DisplayElement

{
void operator () (const elementType& element) const


{
cout << element << ' ';





}
};




СОВЕТ

Обратите внимание, что DisplayElement - это структура. Если бы это был класс, то оператор operator () должен был бы иметь модификатор доступа public. Структура сродни классу, но ее члены являются открытыми по умол­ чанию.





Любая из этих реализаций может применяться с алгоритмом библиотеки STL fo r _ each, чтобы отобразить содержимое коллекции на экране, по одному элементу за раз, как представлено в листинге 21.1.

ЛИСТИНГ 2 1 .1 . Отображение содержимого коллекции на экране с использованием унарной функции_____________________________





  1. #include




  1. #include

  2. #include

  3. #include

4



  1. using namespace std;


7 // структура, ведущая себя как унарная функция



  1. template




  1. struct DisplayElement

  2. {

  3. void operator () (const elementType& element) const




  1. {

  2. cout « element « ' ';




  1. }




  1. };



16



  1. int main ()




  1. {




  1. vector veclntegers;


  1. for (int nCount = 0; nCount < 10; ++ nCount)




  1. veclntegers.push_back (nCount);





  1. list listChars;








  1. for (char nChar = 'a'; nChar < 'k'; ++nChar)




  1. listChars.push_back (nChar);








  1. cout << "Displaying the vector of integers: " << endl;








  1. // Отобразить массив целых чисел

488

ЗАНЯТИЕ 21. Понятие объектов функций




32

for_each ( veclntegers.begin ()

//

Начало

диапазона

33

, veclntegers.end

()

//

Конец

диапазона

34

, DisplayElement



()

); //

Объект унарной функции

35
















  1. cout << endl << endl;




  1. cout << "Displaying the list of characters: " << endl;








  1. // Отобразить список символов




  1. for_each ( listChars.begin () // Начало диапазона

    41

    , listChars.end

    ()

    //

    Конец

    диапазона

    унарной функции

    42

    , DisplayElement



    () );

    // Объект

    43



















  2. return 0;







Результат


Displaying the vector of integers:


0123456789


Displaying the list of characters:


a b c d e f g h i j


Анализ

Строки 8 -15 содержат объект функции D is p la y E le m e n t, реализую щ ей оператор o p e r a t o r (). Этот объект функции используется с алгоритмом s t d : : f o r _ e a c h () би­ блиотеки STL в строках 32 -34 . Алгоритм f o r _ e a c h ( ) получает три параметра: пер­


вый — начальный пункт диапазона, второй — конец диапазона, третий — функция, вызы­ ваемая для каждого элемента в этом диапазоне. Другими словами, код вызывает оператор D is p la y E le m e n t:: o p e r a to r () для каждого элемента в векторе v e c ln te g e r s . Обратите внимание, что вместо структуры D is p la y E le m e n t вы с тем же успехом можете использо­ вать привычную функцию F u n c D isp la y E le m e n t (). Строки 40-^42 демонстрируют те же возможности для списка символов.





СОВЕТ
Стандарт C++11 вводит лямбда-выражения, являющиеся безымянными объек­ тами функций.

Версия лямбда-выражения структуры DisplayElement из листинга 21.1 делает весь код компактней, включая определение структуры и ее применение в трех строках функции main (), если заменить строки 32-34:


// Отобразить массив целых чисел, используя лямбда-выражения for_each ( veclntegers.begin () // Начало диапазона

,

veclntegers.end

()

// Конец диапазона

} );

,

[] (int& Element)

{cout « element « '










// Лямбда-выражение

Таким образом, лямбда-выражения - это фантастическое преимущество C++





  1. вы непременно должны изучать их на занятии 22, "Лямбда-выражения языка С++1Г. Листинг 22.1 демонстрирует использование лямбда-функции в алго­ ритме for_each () для отображения содержимого контейнера вместо объекта функции, как в листинге 21.1.




Типичные приложения объектов функций

489

Реальное преимущество использования объекта функции, реализованного в структуре, становится очевидным, когда вы в состоянии использовать объект структуры для хране­ ния информации. Это нечто, чего функция F u n c D is p la y E le m e n t () не может сделать в отличие от структуры, поскольку структура способна хранить атрибуты, кроме оператора o p e r a to r (). Вот несколько измененная версия, в которой используются атрибуты:




template


struct DisplayElementKeepCount


{


int Count;


DisplayElementKeepCount () // Конструктор

{
Count = 0;


}


void operator () (const elementType& element)

{
++ Count;




cout << element « ' ’;

  1. приведенном выше фрагменте структура D isp la y E le m e n tK e e p C o u n t немного мо­ дифицирована по сравнению с предыдущей версией. Оператор o p e r a t o r () больше не является константной функцией-членом, поскольку он осуществляет инкремент (а следо­ вательно, изменяет) значения переменной-члена C ount, используемой для хранения коли­ чества ее вызовов и применяемой для отображения данных. Этот подсчет возможен благо­ даря открытому атрибуту C ount. Преимущество использования таких объектов функции, способных хранить состояние, показано в листинге 21.2.

ЛИСТИНГ 21.2. Использование объекта функции для хранения состояния________________





  1. #include




  1. #include




  1. #include




  1. using namespace std;








  1. template




  1. struct DisplayElementKeepCount




  1. {




  1. int Count;



9:
1 0 : // Конструктор
1 1 : DisplayElementKeepCount() : Count(0) {}
1 2 :

  1. // Отобразить элемент, хранящий количество!




  1. void operator()(const elementType& element)





  1. ++ Count;

17:

cout « element«

• .

18:







19:










2 0 :

490 ЗАНЯТИЕ 21. Понятие объектов функций



  1. int main()



22: {

  1. vector veclntegers;




  1. for(int nCount = 0; nCount< 10; ++ nCount)




  1. veclntegers.push_back(nCount) ;



26:



  1. cout << "Displaying the vector of integers: "<< endl;








  1. // Отобразить массив целых чисел




  1. DisplayElementKeepCount Result;

    31:

    Result = for_each( veclntegers.begin()

    //

    Начало

    диапазона

    32:

    , veclntegers.end()

    //

    Конец

    диапазона

  2. , DisplayElementKeepCount() ); // объект функции








  1. cout << endl<< endl;








  1. // Использование хранилища состояния при возвращении значения!




  1. cout << " '" << Result.Count << "' elements were displayed!"



<< endl;


39:



  1. return 0;




  1. }



Результат


Displaying the vector of integers:


0123456789



Download 1,38 Mb.

Do'stlaringiz bilan baham:
1   ...   337   338   339   340   341   342   343   344   ...   437




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish