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



Download 1,38 Mb.
bet352/437
Sana22.02.2022
Hajmi1,38 Mb.
#89455
TuriРеферат
1   ...   348   349   350   351   352   353   354   355   ...   437
Bog'liq
word1

#include




  1. #include

2 : #include



  1. linclude

  2. using namespace std;








  1. template

  2. void DisplayContents (const T& Input)

8 : {

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

    1 0 :

    ; iElement != Input.cend ()

    1 1 :

    ; ++

    iElement

    )

    1 2 :

    cout «

    *iElement

    « endl;

  2. }








  1. int main ()




  1. {




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




  1. vector vecNames;



19:
2 0 : // Вставить в вектор несколько примеров имен


vecNames.push_back ("jim"); vecNames.push_back ("Jack");



  1. vecNames.push_back ("Sam");




  1. vecNames.push_back ("Anna");








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




  1. DisplayContents(vecNames);

    28:

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

    29:

    1. endl;




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




  1. DisplayContents(vecNames);



32:


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



    1. endl;




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




  1. [](const strings strl, const strings str2) -> bool




      1. лямбда




  1. {































44:


45:


46:


47:


48:


string strlLowerCase;



  1. Зарезервировать пространство strlLowerCase.resize (strl.size ());

  2. Преобразовать каждый символ в нижний регистр transform(strl.begin(), strl.end(),



strlLowerCase.begin(), tolower);


string str2LowerCase; str2LowerCase.resize (str2.size ()); transform (str2.begin (), str2.end (),


str2LowerCase.begin (),


tolower);

510 ЗАНЯТИЕ 22. Лямбда-выражения языка С++11


49:



  1. return (strlLowerCase < str2LowerCase);




  1. } // конец лямбды




  1. ); // конец сортировки




  1. DisplayContents(vecNames);

54:



  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


Анализ

Здесь приведена большая лямбда-функция, охватывающая строки 35-51, как третий параметр алгоритма s t d : : s o r t (), который начинается в строке 34 и заканчивается в строке 52! Это показывает, что лямбда-функция может состоять из нескольких операторов и предваряться явным определением типа возвращаемого значения (b o o l), как показано





  1. строке 35. Вывод демонстрирует содержимое вектора после вставки значений, где j im следует перед Ja c k , содержимое вектора после сортировки по умолчанию без предостав­ ленных лямбды и предиката (строка 30), где j im следует после Sam благодаря чувстви­

тельному к регистру оператору s t r i n g : : o p e r a t o r ^ и наконец, версию, использующую


независящее от регистра лямбда-выражение (строки 34-52), где j im следует после Ja c k ,


как и ожидал бы обычно пользователь. Кроме того, при этой сортировке используется лямбда-выражение, охватывающее несколько строк.





ПРИМЕЧАНИЕ

Необычно большое лямбда-выражение листинга 22.5 является лямбда-версией













класса CompareStringNoCase из листинга 21.6, используемого в листин­







ге 21.7.







Безусловно, это не оптимальное использование лямбды, поскольку в данном







случае объект функции допускает повторное использование в нескольких вы­







ражениях std::sort (), если нужно, а также в других алгоритмах, которые







нуждаются в бинарном предикате.







Поэтому лямбды необходимо использовать тогда, когда они коротки, изящны и







эффективны.































Резюме

5 1 1




РЕКОМЕНДУЕТСЯ







НЕ РЕКОМЕНДУЕТСЯ







Помните, что лямбда-выражения всегда на­

Не забывайте,

что лямбда-выражения -

это




чинаются с квадратных скобок ([]) или

безымянные представления класса или струк­




([statel,

state2*,.])




туры с оператором operator ()







Помните, что если не указано иное, перемен­

Не забывайте использовать константные па­




ные состояния, предоставляемые в пределах

раметры при создании лямбда-выражений




списка захвата [],

не допускают изменения.

[] (const

Т&

value) { II лямбда-




Для возможности изменения используйте клю­

выражение

;

}







чевое слово mutable







Не забывайте явно указывать тип возвра­






















щаемого значения, когда лямбда-выражение






















включает несколько операторов в пределах




'

.......




'

<: "

.". й.. ''

блока {)













: .•:! ' •










Не предпочитайте лямбда-выражения объекту




: '

, •

' ■


















функции, когда лямбда становится чрезвычайно

длинной и охватывает несколько операторов,


поскольку они переопределяются при каждом


использовании и не позволяют использовать


код повторно




Резюме

На сегодняшнем занятии рассматривалось очень важное средство языка C++11 — лямбда-функции. Вы узнали, что лямбды — это безымянные объекты функций, способные получать параметры, хранить состояние, возвращать значения и быть многострочными. Вы научились использовать лямбды вместо объектов функций в таких алгоритмах STL, как fin d (), s o r t () или tra n sfo rm (). Лямбды делают программирование на C++ бы­ стрым и эффективным, поэтому постарайтесь использовать их по возможности чаще.




Вопросы и ответы



  1. Всегда ли я должен предпочитать лямбды объектам функций?

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





  1. К ак передаются парам етры состояния лямбды, по значению или по ссылке?

Лямбда создается со списком захвата так:




[Varl, Var2, ... N](Туре& Paraml, ... ) { ...expression ;}



  1. Параметры состояния V a r l и Var2 копируются (а не передаются по ссылке). Если хо­ тите иметь их как ссылочные параметры, используйте такой синтаксис:

[&Varl, &Vаг2, ... &N](Туре& Paraml, ... ) { ...expression ;}

В данном случае нужна осторожность, поскольку модификация переменных состояния, переданных в пределах списка захвата, распространяется вне лямбды.






  1. Могу ли я использовать локальны е переменные в лямбде как в функции?

512 ЗАНЯТИЕ 22. Лямбда-выражения языка С++11

Вы можете передать локальные переменные в списке захвата:





Download 1,38 Mb.

Do'stlaringiz bilan baham:
1   ...   348   349   350   351   352   353   354   355   ...   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