Skip to content

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
cpp
[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

cpp
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

cpp
#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

cpp
#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

cpp
#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: 3

Capture 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

cpp
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

cpp
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
cpp
int add(int a, int b) {
  return a + b;
}
Lambda funksiya
cpp
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.