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


elementType operator () (const elementType&



Download 1,38 Mb.
bet346/437
Sana22.02.2022
Hajmi1,38 Mb.
#89455
TuriРеферат
1   ...   342   343   344   345   346   347   348   349   ...   437
Bog'liq
word1

8

elementType operator () (const elementType&

eleml,

9

const elementType&

elem2)




10
11


12


13


14


15


16


17


18


19
20

21


22


23


24


25


26


27


28


29


30


31


32


33


34
{
return (eleml * elem2);

}
};




int main ()

{
using namespace std;





  1. Создание двух векторов целых чисел по 10 элементов каждый vector vecMultiplicand, vecMultiplier;

  2. Вставить примеры значений от 0 до 9



for (int nCountl = 0; nCountl < 10; ++ nCountl)


vecMultiplicand.push_back (nCountl);


// Вставить примеры значений от 100 до 109


for (int nCount2 = 100; nCount2 < 110; ++ nCount2)


vecMultiplier.push_back (nCount2);



  1. Третий контейнер содержит результат умножения vector vecResult;

  2. Создать пространство для результата умножения vecResult.resize (10);

494

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










35

transform ( vecMultiplicand.begin (),

//

диапазон

множителей

36

vecMultiplicand.end

(),

//

конец диапазона

37

vecMultiplier.begin

(),

//

значения

множителей

  1. vecResult.begin (), // диапазон, содержащий результат




  1. Multiply () ); // умножающая функция



40


41 cout « "The contents of the first vector are: " « endl;



  1. for (size_t nlndexl = 0; nlndexl < vecMultiplicand.size ();




    1. nlndexl)



43 cout « vecMultiplicand [nlndexl] « ’



  1. cout << endl;







46 cout « "The contents of the second vector are: " « endl;



  1. for (size_t nlndex2 = 0; nlndex2 < vecMultiplier.size (); ++nlndex2)

  2. cout << vecMultiplier [nlndex2] « ' ';




  1. cout << endl << endl;



50



  1. cout << "The result of the multiplication is: " << endl;




  1. for (size_t nlndex = 0; nlndex < vecResult.size (); ++ nlndex)




  1. cout << vecResult [nlndex] << ' ';



54



  1. return 0;







Результат


The contents of the first vector are:


0123456789


The contents of the second vector are:


100 101 102 103 104 105 106 107 108 109
i
The result of the multiplication held in the third vector is:


0 101 204 309 416 525 636 749 864 981


Анализ

С троки 5 -1 3 сод ерж ат класс M u l t i p l y . В данном п ри м ере алгоритм s t d : : tr a n s f o r m () используется для умножения содержимого двух диапазонов и сохра­


нения результата в третьем. В данном случае рассматриваемые диапазоны содержатся в объектах v e c M u ltip lic a n d , v e c M u l t i p l i e r и v e c R e s u lt класса s t d : : v e c to r . Дру­ гими словами, функция s t d : : t r a n s f o r m () в строках 35 -39 используется для умноже­ ния каждого элемента вектора v e c M u lt ip lic a n d на соответствующий элемент вектора v e c M u lt ip lie r и сохраняет результат умножения в векторе v e c R e s u lt . Само умножение осущ ествляется бинарной функцией C M u ltip le : : o p e r a t o r (), которая вызывается для каждого элемента в исходных и результирующих диапазонах векторов. Возвращаемое зна­ чение оператора o p e r a t o r () сохраняется в векторе v e c R e s u lt.


Таким образом, этот пример демонстрирует применение бинарных функций для вы­ полнения арифметических операций с элементами в контейнерах STL.





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

495



Бинарный предикат

Функция, которая получает два аргумента и возвращает значение типа b o o l, является бинарным предикатом. Такие функции находят применение в таких алгоритмах библиоте­ ки STL, как s t d : : s o r t (). Листинг 21.6 демонстрирует применение бинарного предиката, который сравнивает две строки после перевода их в нижний регистр. Такой предикат при­ меняется при выполнении независящей от регистра сортировки вектора строк, например.




ЛИСТИНГ 21.6. Бинарный предикат для сортировки строк, независящей от регистра_______



  1. #include




  1. #include




  1. using namespace std;








  1. class CompareStringNoCase




  1. {




  1. public:



7: bool operator () (const strings strl, const strings str2) const


8 : {

  1. string strlLowerCase;



1 0 :

  1. // Зарезервировать пространство




  1. strlLowerCase.resize (strl.size ());








  1. // Преобразовать каждый символ в нижний регистр




  1. transform (strl.begin (), strl.end О,



16: strlLowerCase.begin (), tolower);


17:



  1. string str2LowerCase;




  1. str2LowerCase.resize (str2.size ());




  1. transform (str2.begin (), str2.end (),



21: str2LowerCase.begin (), tolower);
2 2 :

  1. return (strlLowerCase < str2LowerCase);




  1. }




  1. };



Анализ

Бинарный предикат, реализованный в операторе o p e r a t o r (), сначала переводит вве-денные строки в нижний регистр, используя алгоритм s t d : : tr a n s f o r m (), как показано





  1. строках 15 и 20, а затем использует оператор сравнения строк o p e r a to r < для возвраще­ ния результата сравнения.

Вы можете использовать этот двоичный предикат с алгоритмом s t d : : s o r t () для со­ ртировки динамического массива, содержащегося в векторе строк, как представлено в ли­ стинге 21.7.


ЛИСТИНГ 21.7. Использование объекта функции класса CompareStringNoCase

для независящей от регистра сортировки вектора строк_______________________________





  1. // Здесь вставьте код класса CompareStringNoCase из листинга 21.6




  1. #include

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





  1. #include





  1. template




  1. void DisplayContents (const T& Input)




  1. {

7 for(auto iElement = Input.cbegin() // auto, cbegin и cend: C++11



  1. ; iElement != Input.cend ()




  1. ; ++ iElement )




  1. cout « *iElement « endl;

  2. }

12



  1. int main ()




  1. {




  1. // Определить вектор строк для имен




  1. vector vecNames;



17



  1. // Вставить в вектор несколько примеров имен




  1. vecNames.push_back ("jim");




  1. vecNames,push_back ("Jack");




  1. vecNames.push_back ("Sam");




  1. vecNames.push_back ("Anna");



23



  1. cout « "The names in vector in order of insertion: " << endl;




  1. DisplayContents(vecNames);








  1. cout << "Names after sorting using default std::less<>: "




  1. endl;




  1. sort(vecNames.begin(), vecNames.end());




  1. DisplayContents(vecNames); ’



30



  1. cout « "Names after sorting using predicate that ignores case:"




    1. endl;




  1. sort(vecNames.begin(), vecNames.end(), CompareStringNoCase());




  1. DisplayContents(vecNames);



34



  1. return 0;




  1. }



Результат


The names in vector in order of insertion:


jim


Jack


Sam


Anna


Names after sorting using default std::less<>:


Anna


Jack


Sam


jim


Names after sorting using predicate that ignores case:


Anna


Jack


jim


Sam

Резюме

4 9 7



Анализ

Вывод отображает содержимое вектора на трех этапах. На первом содержимое отобра­ жается в порядке вставки. На втором этапе, после сортировки в строке 28 с использова­ нием заданного по умолчанию предиката сортировки le ss< T > , вывод демонстрирует, что j im располагается не после Ja ck , поскольку эта сортировка зависит от регистра благодаря оператору s t r i n g : : o p e r a t o r s Последняя версия использует класс предиката сортиров­ ки C o m p a re stг in g N o C a s e o в строке 32 (он реализован в листинге 21.6), гарантирующе­ го, что j im будет следовать после Ja c k , несмотря на различие в регистре.


Бинарные предикаты применяются во множестве алгоритмов STL. Например, в ал­


горитме s t d : : u n i q u e ( ) , удаляющем совпадаю щ ие соседние элементы, в алгоритме


s t d : : s o r t (), осущ ествляю щ ем сортировку, в алгоритме s t d : : s t a b l e s o r t (), осу­





  1. ествляющем сортировку в относительном порядке, в алгоритме s t d : : tr a n s f o r m (), позволяющем выполнить операцию с двумя диапазонами, и во многих других алгоритмах библиотеки STL, нуждающихся в бинарном предикате.



Резюме

На этом занятии вы познакомились с функторами (или объектами функций). Вы узна­ ли, что объекты функций, реализованные в структуре или классе, полезней простых функ­ ций, поскольку они могут использоваться также для содержания информации состояния. Вы получили понятие о предикатах, которые являются специальным классом объектов функции, и ознакомились с некоторыми практическими примерами, демонстрирующими их удобство.



Download 1,38 Mb.

Do'stlaringiz bilan baham:
1   ...   342   343   344   345   346   347   348   349   ...   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