Lambda İfadeleri
C++’da Lambda ifadeleri, adlandırılmamış ve genellikle kısa ömürlü işlevleri tanımlamak için kullanılan fonksiyonel programlama yapılarıdır. C++11 ile tanıtılan bu yapı, özellikle STL algoritmalarıyla çalışırken, veri işleme, filtreleme, dönüştürme ve hızlı hesaplamalar için kritik bir araçtır. Lambda ifadeleri, kapsam içindeki değişkenleri değer veya referans ile yakalayabilir; böylece, değişkenlerin kontrolünü ve bellek yönetimini kolaylaştırır.
Lambda ifadeleri, kodun okunabilirliğini artırırken fonksiyonel mantığı doğrudan kullanım noktasına taşır. Bu, özellikle OOP prensipleri ve veri yapılarıyla birlikte kullanıldığında, projelerde modüler ve optimize edilmiş çözümler üretmeyi sağlar. Bu ders kapsamında okuyucular, temel ve ileri düzey lambda ifadelerini öğrenerek, STL algoritmalarıyla entegrasyon, veri filtreleme, toplama ve sınıf içi yöntemlere erişim gibi pratik uygulamalar geliştireceklerdir. Ayrıca, bellek sızıntıları, hatalı referans kullanımı ve verimsiz algoritmalardan kaçınma gibi C++’a özgü dikkat edilmesi gereken konular ele alınacaktır.
Temel Örnek
text\#include <iostream>
\#include <vector>
\#include <algorithm>
int main() {
std::vector<int> sayilar = {1, 2, 3, 4, 5};
// Lambda ile elemanları yazdırma
auto yazdir = [](int n) { std::cout << n << " "; };
std::cout << "Orijinal sayılar: ";
std::for_each(sayilar.begin(), sayilar.end(), yazdir);
std::cout << std::endl;
// Lambda ile değerleri iki katına çıkarma
std::for_each(sayilar.begin(), sayilar.end(), [](int &n) { n *= 2; });
std::cout << "İki katına çıkmış sayılar: ";
std::for_each(sayilar.begin(), sayilar.end(), yazdir);
std::cout << std::endl;
return 0;
}
Bu temel örnekte, bir vektör oluşturulmuş ve lambda ifadeleri ile elemanlar üzerinde işlem yapılmıştır. auto yazdir = [](int n){ ... }
ifadesi, değişkenleri yakalamadan yalnızca yazdırma işlemi yapar. [](int &n){ n *= 2; }
ifadesi ise referans ile aldığı değerleri doğrudan değiştirir. Bu sayede, lambda ifadeleri STL algoritmaları ile birleşerek, veri manipülasyonu ve hesaplamaları kısa ve okunabilir bir şekilde yapılabilir. Lambda ifadeleri ayrıca, değişken yakalama yöntemleri ile bellek ve kapsam kontrolü sağlar.
Pratik Örnek
text\#include <iostream>
\#include <vector>
\#include <algorithm>
\#include <numeric>
class VeriIsleyici {
public:
void islemYap() {
std::vector<int> veriler = {3, 7, 2, 9, 5};
int limit = 5;
std::vector<int> filtreli;
std::copy_if(veriler.begin(), veriler.end(), std::back_inserter(filtreli),
[limit](int n) { return n > limit; });
int toplam = std::accumulate(filtreli.begin(), filtreli.end(), 0,
[](int acc, int n){ return acc + n; });
std::cout << "5'ten büyük elemanların toplamı: " << toplam << std::endl;
std::for_each(filtreli.begin(), filtreli.end(),
[this](int n){ sonucGoster(n); });
}
private:
void sonucGoster(int deger) {
std::cout << "İşlenen değer: " << deger << std::endl;
}
};
int main() {
VeriIsleyici vi;
vi.islemYap();
return 0;
}
Bu ileri seviye örnekte lambda ifadeleri, veri filtreleme, toplam hesaplama ve sınıf içi fonksiyon çağrıları için kullanılmıştır. [limit](int n){ return n > limit; }
ile limit değeri yakalanarak filtreleme yapılır. [](int acc, int n){ return acc + n; }
ifadesi std::accumulate
ile toplam hesaplar. [this](int n){ sonucGoster(n); }
ise sınıf üyelerine erişimi sağlar. Bu kullanım, C++’ta lambda ifadelerinin OOP ve STL algoritmaları ile entegrasyonunu göstermektedir.
Lambda ifadelerinde dikkat edilmesi gerekenler; yakalanacak değişkenlerin doğru seçimi, mutable
kullanımının bilinçli yapılması ve gereksiz kopyalardan kaçınılmasıdır. Hatalı yakalama veya geçersiz referans kullanımı, bellek sızıntıları ve tanımsız davranışa yol açabilir. Performans optimizasyonu için lambda ifadeleri STL algoritmalarıyla birlikte kullanılmalı ve move semantics ile gereksiz kopyalardan kaçınılmalıdır. Çoklu iş parçacığı ortamlarında, değişken yakalama ve erişim güvenliği kritik öneme sahiptir.
📊 Referans Tablosu
C++ Element/Concept | Description | Usage Example |
---|---|---|
Yakalama Listesi | Lambda içinde erişilecek değişkenler | \[x, \&y]\(int n){ return n+x+y; } |
Parametre Listesi | Lambda parametrelerini tanımlar | (int a, int b){ return a+b; } |
Dönüş Tipi | Opsiyonel olarak belirtilir | \[]\(int n) -> double { return n*1.5; } |
mutable | Değer ile yakalanan değişkenlerin değiştirilebilmesini sağlar | [x]() mutable { x += 10; } |
Genel Lambda | auto ile generic parametreler | \[]\(auto a, auto b){ return a+b; } |
this Yakalama | Sınıf üyelerine erişim | [this](){ this->metod(); } |
Lambda ifadeleri, C++ kodunu daha kısa, modüler ve okunabilir hale getirir. Değişken yakalama yöntemleri, STL algoritmaları ile entegrasyon ve performans optimizasyonu konularını anlamak, ileri seviye C++ projelerinde kritik öneme sahiptir. Sonraki adımlar, generic ve recursive lambda kullanımı, çoklu iş parçacığı ortamlarında lambda kullanımı ve tasarım desenleri ile entegrasyonu içermelidir.
🧠 Bilginizi Test Edin
Test Your Knowledge
Test your understanding of this topic with practical questions.
📝 Talimatlar
- Her soruyu dikkatle okuyun
- Her soru için en iyi cevabı seçin
- Quiz'i istediğiniz kadar tekrar alabilirsiniz
- İlerlemeniz üstte gösterilecek