Lambda ifodalari (Lambda Functions)
Lambda funksiyalari
Lambda funksiyasi — kod ichida bevosita yozish mumkin bo'lgan kichik, nomsiz funksiya. Tezda funksiya kerak bo'lganda, uni alohida nomlash yoki e'lon qilmasdan ishlatish uchun foydali.
Uni "tezkor mini funksiya" deb tasavvur qiling.
SINTAKSIS
[capture] (parametrlar) { kod };[capture] nima ekanini keyinroq tushuntiramiz. Hozircha bo'sh qavslardan foydalanamiz.
Oddiy lambda misoli
message lambda funksiyasini saqlaydi va ekranga xabar chiqaradi:
MISOL
int main() {
auto message = []() {
cout << "Salom Dunyo!\n";
};
message();
return 0;
}Natija: Salom Dunyo!
Parametrli lambda
Oddiy funksiya kabi lambda ga ham qiymatlar uzatish mumkin:
MISOL
#include <iostream>
using namespace std;
int main() {
auto add = [](int a, int b) {
return a + b;
};
cout << add(3, 4);
return 0;
}Natija: 7
Lambdani funksiyaga uzatish
Lambda funksiyasini boshqa funksiyaga argument sifatida uzatish mumkin. Bu funksiyaga qanday ma'lumot emas, balki nima qilish kerakligini aytmoqchi bo'lganda foydali:
MISOL
#include <iostream>
#include <functional> // std::function uchun kerak
using namespace std;
// Boshqa funksiyani parametr sifatida qabul qiluvchi funksiya
void myFunction(function<void()> func) {
func();
func();
}
int main() {
auto message = []() {
cout << "Salom Dunyo!\n";
};
myFunction(message);
return 0;
}Natija:
Salom Dunyo!
Salom Dunyo!ESLATMA
Bu misol ishlashi uchun <functional> kutubxonasini kiritish kerak.
Tsikllarda lambda ishlatish
Tsikl ichida lambda funksiyasini aniqlash va ishlatish mumkin:
MISOL
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 3; i++) {
auto show = [i]() {
cout << "Raqam: " << i << "\n";
};
show();
}
return 0;
}Natija:
Raqam: 1
Raqam: 2
Raqam: 3Capture clause []
[] qavslar yordamida lambda ga tashqi o'zgaruvchilarga kirish imkonini berish mumkin. Bu capture clause deyiladi.
Quyidagi misolda lambda x o'zgaruvchisini qiymat bo'yicha (nusxa) qamrab oladi:
MISOL
int main() {
int x = 10;
auto show = [x]() {
cout << x;
};
show();
return 0;
}Natija: 10
MA'LUMOT
Lambda x ning nusxasini ishlatadi. Lambda aniqlangandan keyin x ni o'zgartirsangiz, lambda ichidagi qiymatga ta'sir qilmaydi.
Havola orqali qamrab olish
Lambda o'zgaruvchining so'nggi qiymatini ishlashini xohlasangiz, [&] yordamida havola orqali qamrab oling. Lambda asl o'zgaruvchi bilan ishlaydi:
MISOL
int main() {
int x = 10;
auto show = [&x]() {
cout << x;
};
x = 20; // Lambda yaratilgandan keyin x ni o'zgartirish
show();
return 0;
}Natija: 20
Nima uchun? Lambda asl x o'zgaruvchisini ko'radi, shuning uchun x o'zgartirilganda lambda yangilangan qiymatni ishlatadi.
Oddiy funksiyalar va lambda funksiyalar
Ikkala tur ham kodni guruhlash va keyinroq ishga tushirishga imkon beradi, ammo ular biroz boshqacha vaziyatlarda ishlatiladi.
Oddiy funksiya qachon ishlating:
- Funksiyani bir nechta joyda qayta ishlatmoqchi bo'lsangiz
- Funksiyaga aniq, mazmunli nom bermoqchi bo'lsangiz
- Mantiq uzoq yoki murakkab bo'lsa
Lambda funksiya qachon ishlating:
- Funksiyani faqat bir marta ishlatish kerak bo'lsa
- Kod qisqa va oddiy bo'lsa
- Boshqa funksiyaga tezkor funksiya uzatmoqchi bo'lsangiz
Ikkala misol ham bir xil natija beradi — 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;
};MASLAHAT
Lambda versiyasi funksiyani keyinroq qayta ishlatish kerak bo'lmaganda juda qulay. U tezkor va bloklar ichida yoki boshqa funksiyalarga argument sifatida yaxshi ishlaydi.
