C++ lambda funksiyalar
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!
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
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!
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
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
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
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!
