Programlama dilleri, kendilerini uzun zaman önce kuran C++ gibiler bile sürekli olarak gelişir. Standart kitaplıklara işlevler ekler ve dinamik bir alanda çalışan programcıların işini kolaylaştırmak için başka değişiklikler yaparlar.

C++'da Lambda İfadeleri için Hızlı Kılavuz

Dilin evriminin getirdiği güncellemelerin bir parçası olarak C++, 2011 sürümünde lambda ifadeleri için destek ekledi.

Lambda ifadesi tam olarak nedir ve bir C++ programcısı olarak bunu kendi yararınıza nasıl kullanabilirsiniz?

Lambda İfadesi Nedir?

Bir lambda ifadesi, lambda işlevi olarak da bilinir. Tıpkı tipik bir işlev gibi, bağımsız değişkenleri kabul etme, işlemleri gerçekleştirme ve bir değer döndürme yeteneğine sahip satır içi bir ifadedir .

Bir lambda’yı başka bir fonksiyonun içinde kullanabilir ve onu bir değişkene atayabilirsiniz. Lamba işlevleri, bir programda anonim bir işlev nesnesi tanımlamanın pratik bir yoludur. Neredeyse her dil lambdaları destekler, ancak her uygulama diğerlerinden farklıdır.

C++ Lambda İfadesinin Parçaları Nelerdir?

Lambda ifadelerinin C++’da kullanımı kolaydır. Bir lambda ifadesinin sözdizimini C++’da aşağıdaki gibi parçalayabilirsiniz:

[capture_clause](parameters) options { expression_body; }

Örneğin:

int val = 13;

auto sumPlusVal = [val](int a, int b) mutable noexcept ->int { return val + a + b ; };

sumPlusVal(2, 5); // 20

Bir lambda ifadesi herhangi bir veri türünü kabul edip döndürebildiğinden , bu kod sumPlusVal değişkenini auto olarak bildirir. Bu, derleme sırasında türü belirlemeyi derleyiciye bırakır.

Yukarıdaki koddan, bir lambda ifadesinin nasıl çalıştığını belirten birkaç parça içerdiğini görebilirsiniz. İşte bu bileşenlerin her birine hızlı bir genel bakış.

Capture yan tümcesi : Bu, önceden var olan değişkenleri belirtebileceğiniz veya ifade gövdesinde kullanmak üzere yenilerini tanımlayabileceğiniz bir lambda ifadesinin ilk bölümüdür. Yakalamaları belirtmenin farklı yolları vardır, örneğin:

auto addTwo = [foo](){ return foo + 2; }; // by value

auto addThree = [&bar](){ return bar + 3; }; // by reference

auto addAllVal = [=](){ return foo + bar; }; // all by value

auto addAllRef = [&](){ return foo + bar; }; // all by reference

// create a variable in capture clause

auto createVarInCapture = [fooBar = foo + bar](){ return fooBar * 5; };

// no capture – returns error because foo is not accessible

auto errorExpression = [](){ return foo + 2; };

Parametreler: Lambda ifadesinin bu kısmı da isteğe bağlıdır. Lambda’nın gerektirdiği fonksiyon parametrelerini içerir. Bu, C++’da fonksiyon parametrelerini tanımlamanızın olağan yolundan farklı değildir.

Seçenekler: Bir lambda ifadesi tanımlarken de seçenekler belirtebilirsiniz. Kullanabileceğiniz bazı seçenekler şunlardır: mutable , istisna ( örneğin ilk örnek kodda noexcept), – >return_type (örneğin ->int ), gerektirir , nitelikler vb . lambda. Aşağıdaki kod bunu göstermektedir.

int value = 10;

// returns an error – value is a const inside the expression

auto decrement = [value](){ return –value; };

auto increment = [value]() mutable { return ++value; };

increment(); // 11

Diğer seçenekler nadiren kullanılsa da bunlar hakkında daha fazla bilgiyi lambdalar üzerinde cppreference.com sayfasından edinebilirsiniz.

İfade gövdesi : Bu, bir işlevin yapacağı gibi, bir değeri yürüten ve döndüren lambda ifadesinin gövdesidir. Gerekirse, bir lambda ifadesinin gövdesini birden fazla satıra bölebilirsiniz. Ancak, düzensiz kodu önlemek için mümkün olduğunca kısa tutmak en iyi uygulamadır.

Lambda İfadelerinin Faydaları Nelerdir?

Kodunuzda lambda işlevlerini kullanmanın birçok avantajı vardır. Artan geliştirme hızı ve verimliliğinin yanı sıra lambdalardan elde ettiğiniz en önemli faydalar şunlardır:

Lambda ifadeleri, kodun temiz tutulmasına yardımcı olur . Kodunuzu basit ve düzenli tutmanın en iyi yollarından biri, mümkün olduğunda lambda kullanmaktır. Bu, okunabilir ve yeniden kullanılabilir bir kod yapısının korunmasında çok yardımcı olabilir.

Lambdaları parametre olarak diğer fonksiyonlara geçirebilirsiniz . C++ standart kitaplığının std::sort() yöntemi bu avantajdan yararlanır . İşlevin sıralamayı nasıl gerçekleştireceğini belirtmek için bu yöntemin parametrelerinden biri olarak bir lambda iletebilirsiniz. Örneğin:

  std::vector<int> arr = {2, 5, 1, 3, 4};

  std::sort(arr.begin(), arr.end(), [](int a, int b){ return a < b; });

  // arr = {1, 2, 3, 4, 5}

Lambdalar yeniden kullanılabilir . Bazen bir kod bloğunu yeni bir fonksiyon tanımlamaya gerek kalmadan programınızdaki bir fonksiyon kapsamında yeniden kullanılabilir hale getirmek isteyebilirsiniz. Lambdalar bu gibi durumlarda çok yardımcı olabilir. Aşağıdaki yeniden kullanılabilir lambda ifadesi örneğini düşünün:

#include <iostream>

using namespace std;

int main() {

    // define a reusable lambda

    auto addUp = [](auto a, auto b, auto c) noexcept {

        cout << “Now adding up… ” << a << “, ” << b << ” and ” << c << endl;

        return a + b + c ;

    };

    cout << addUp(22, 33, 44) << endl;

    cout << addUp(string(“Happy “), string(“Birth”), string(“day”)) << endl;

    cout << addUp(true, false, true) << std::endl; // executes as numbers(1 and 0)

}

Bu program aşağıdaki sonucu üretir:

yeniden kullanılabilir bir lambda gösteren kod çıktısı

Bu örnek, herhangi bir türle kullanabilmeniz için bir lambda tanımlamanın ne kadar basit olduğunu gösterir.

Lambda’ları C++’da Kullanma

Lambda ifadelerinin sunduğu başka birçok fayda vardır ve bunları programınızın yapısı daha karmaşık hale geldikçe keşfedeceksiniz. Aslında, C++ programcıları bazen lambda ifadelerine kapanışlar olarak atıfta bulunurlar çünkü bunlar kodda kapanışları uygulamak için harika bir yoldur.

Modern C++ kavramlarını kod tabanınıza dahil etmek istiyorsanız lambda ifadelerini göz önünde bulundurmalısınız.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir