C++ lambda funksiyalar


ULASHISH

Lambda funksiyalar

Lambda funksiya — kodingizda bevosita yozish mumkin bo‘lgan kichik, anonim (nomsiz) funksiya. U funksiyaga nom bermasdan yoki uni alohida e’lon qilmasdan tezkor funksiya kerak bo‘lganda foydali.

Uni "joyida yoziladigan mini funksiya" deb tasavvur qiling.

Sintaksis

[capture] (parameters) { code };

Xavotir olmang: [capture] nimani anglatishini keyinroq tushuntiramiz. Hozircha shunchaki bo‘sh kvadrat qavslar juftligidan foydalanamiz.


Oddiy lambda misoli

Bu yerda message ekranga xabar chiqaradigan lambda funksiyani saqlaydi:

Misol

int main() {   auto message = []() {     cout << "Hello World!\n";   };   message();   return 0; }

Natija:

Hello World!
O‘zingiz sinab ko‘ring »

Parametrli lambda

Lambdaga xuddi oddiy funksiyadagidek qiymatlar uzatishingiz mumkin:

#include <iostream> using namespace std; int main() {   auto add = [](int a, int b) {     return a + b;   };   cout << add(3, 4);   return 0; }

Natija:

7
O‘zingiz sinab ko‘ring »


Lambdalarni funksiyalarga uzatish

Shuningdek, lambda funksiyani argument sifatida boshqa funksiyaga uzatishingiz mumkin.

Bu funksiyaga qaysi ma’lumotdan foydalanishnigina emas, balki nima qilish kerakligini ham aytmoqchi bo‘lganingizda foydali.

Quyidagi misolda kichik lambda funksiyani boshqa funksiyaga yuboramiz, u esa uni ikki marta ishga tushiradi:

#include <iostream> #include <functional> // Needed for std::function using namespace std; // A function that takes another function as parameter void myFunction(function<void()> func) {   func();   func(); } int main() {   auto message = []() {     cout << "Hello World!\n";   };   myFunction(message);   return 0; }

Natija:

Hello World!
Hello World!
O‘zingiz sinab ko‘ring »

E’tibor bering, bu misol ishlashi uchun <functional> kutubxonasini qo‘shishingiz (include) shart.


Sikllarda lambdalardan foydalanish

Lambda funksiyani sikl ichida aniqlab, undan foydalanishingiz mumkin — bu tezkor amallar uchun juda qulay:

#include <iostream> using namespace std; int main() {   for (int i = 1; i <= 3; i++) {     auto show = [i]() {       cout << "Number: " << i << "\n";     };     show();   }   return 0; }

Natija:

Number: 1
Number: 2
Number: 3
O‘zingiz sinab ko‘ring »

Qamrab olish bandi (capture clause) []

Lambdaga undan tashqaridagi o‘zgaruvchilarga murojaat qilish imkonini berish uchun [ ] qavslaridan foydalanishingiz mumkin.

Bu qamrab olish bandi (capture clause) deb ataladi.

Bu misolda lambda x o‘zgaruvchisini qiymat bo‘yicha (nusxa sifatida) qamrab oladi:

int main() {   int x = 10;   auto show = [x]() {     cout << x;   };   show();   return 0; }

Natija:

10
O‘zingiz sinab ko‘ring »

Eslatma: Lambda x o‘zgaruvchisining nusxasidan foydalanadi. Agar lambdani aniqlagandan keyin x qiymatini o‘zgartirsangiz, bu lambda ichidagi qiymatga ta’sir qilmaydi.

Eslatma: Havola orqali qamrab olish uchun [&] sintaksisidan ham foydalanishingiz mumkin.


Havola orqali qamrab olish

Agar lambda o‘zgaruvchining (shunchaki nusxasini emas) eng so‘nggi qiymatini ishlatishini istasangiz, uni havola orqali qamrab olish uchun [&] sintaksisidan foydalanishingiz mumkin.

Bu lambda alohida nusxa bilan emas, balki asl o‘zgaruvchi bilan ishlashini anglatadi:

int main() {   int x = 10;   auto show = [&x]() {     cout << x;   };   x = 20;  // Change x after the lambda is created   show();   return 0; }

Natija:

20
O‘zingiz sinab ko‘ring »

Nega? Lambda asl x o‘zgaruvchisini ko‘radi, shuning uchun x qiymatini o‘zgartirganingizda lambda yangilangan qiymatdan foydalanadi.


Oddiy funksiyalar va lambda funksiyalar

Oddiy funksiyalar ham, lambda funksiyalar ham kodni guruhlab, keyinroq ishga tushirish imkonini beradi, lekin ular biroz farqli vaziyatlarda ishlatiladi.

Oddiy funksiyadan quyidagi hollarda foydalaning:

  • Funksiyadan bir nechta joyda qayta foydalanishni rejalashtirsangiz
  • Funksiyaga aniq, mazmunli nom bermoqchi bo‘lsangiz
  • Mantiq uzun yoki murakkab bo‘lsa

Lambda funksiyadan quyidagi hollarda foydalaning:

  • Funksiya faqat bir marta kerak bo‘lsa
  • Kod qisqa va oddiy bo‘lsa
  • Boshqa funksiyaga tezkor funksiya uzatmoqchi bo‘lsangiz

Bu ikkala misol ham bir xil ishni bajaradi. Ular ikki sonning yig‘indisini qaytaradi:

Oddiy funksiya

int add(int a, int b) {   return a + b; }

Lambda funksiya

auto add = [](int a, int b) {   return a + b; };

Eslatma: Funksiyadan keyinroq qayta foydalanish kerak bo‘lmasa, lambda varianti juda qulay. U tezkor bo‘lib, bloklar ichida yoki boshqa funksiyalarga argument sifatida yaxshi ishlaydi.




W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!