Aracılığıyla paylaş


Lambda İfadesi Sözdizimi

Bu makalede lambda ifadelerinin söz dizimi ve yapısal öğeleri gösterilmektedir. Lambda ifadelerinin açıklaması için bkz . Lambda İfadeleri.

İşlev Nesneleri ile Lambdaların Karşılaştırılması

Kod yazarken, büyük olasılıkla sorunları çözmek ve özellikle C++ Standart Kitaplık algoritmalarını kullanırken hesaplamalar yapmak için işlev işaretçilerini ve işlev nesnelerini kullanırsınız. İşlev işaretçilerinin ve işlev nesnelerinin avantajları ve dezavantajları vardır; örneğin, işlev işaretçileri çok az sayıda bozulma ek yüküne sahiptir, ancak kapsam içinde durumu korumaz ve işlev nesneleri durumu koruyabilir, ancak sınıf tanımının bozulmamış ek yükünü gerektirebilir.

Bir lambda, işlev işaretçilerinin ve işlev nesnelerinin avantajlarını bir araya getirirken dezavantajlarını ortadan kaldırır. Bir işlev nesnesi gibi lambda da esnektir ve durumu koruyabilir, ancak bir işlev nesnesinin aksine, küçük söz dizimi açık bir sınıf tanımı gerektirmez. Lambdaları kullanarak, bir işlev nesnesine eşdeğer koda göre daha az hantal ve hataya daha az eğilimli kod yazabilirsiniz.

Aşağıdaki örnekler, lambda kullanımını işlevi nesnesi kullanımıyla karşılaştırır. İlk örnek, bir nesnedeki her öğenin çift veya tek olmasına bakılmaksızın konsola yazdırmak için lambda vector kullanır. İkinci örnek aynı görevi başarmak için bir işlev nesnesi kullanır.

Örnek 1: Bir Lambda Kullanma

Bu örnek, for_each işlevine bir lambda geçirir. Lambda, bir nesnedeki her öğenin çift mi yoksa tek mi olduğunu belirten bir vector sonuç yazdırır.

Kod

// even_lambda.cpp
// compile with: cl /EHsc /nologo /W4 /MTd
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main()
{
   // Create a vector object that contains 9 elements.
   vector<int> v;
   for (int i = 1; i < 10; ++i) {
      v.push_back(i);
   }

   // Count the number of even numbers in the vector by
   // using the for_each function and a lambda.
   int evenCount = 0;
   for_each(v.begin(), v.end(), [&evenCount] (int n) {
      cout << n;
      if (n % 2 == 0) {
         cout << " is even " << endl;
         ++evenCount;
      } else {
         cout << " is odd " << endl;
      }
   });

   // Print the count of even numbers to the console.
   cout << "There are " << evenCount
        << " even numbers in the vector." << endl;
}
1 is odd
2 is even
3 is odd
4 is even
5 is odd
6 is even
7 is odd
8 is even
9 is odd
There are 4 even numbers in the vector.

Açıklamalar

Örnekte, for_each işlevinin üçüncü bağımsız değişkeni bir lambda'dır. [&evenCount] bölümü ifadenin yakalama yan tümcesini belirtir, (int n) parametre listesini belirtir ve kalan bölüm ifadenin gövdesini belirtir.

Örnek 2: Bir İşlev Nesnesi Kullanma

Bazen bir lambda önceki örnekten daha fazla genişletmek için çok kullanışsız olur. Sonraki örnekte, Örnek 1 ile aynı sonuçları elde etmek için for_each işleviyle birlikte lambda yerine işlev nesnesi kullanılır. Her iki örnek de bir vector nesnedeki çift sayıların sayısını depolar. İşlemin durumunu korumak için sınıfı, FunctorClass değişkeni başvuruya m_evenCount göre üye değişkeni olarak depolar. İşlemi FunctorClass gerçekleştirmek için function-call operator() işlecini uygular. Microsoft C++ derleyicisi, Örnek 1'deki lambda koduyla boyut ve performans açısından karşılaştırılabilir bir kod oluşturur. Bu makaledeki gibi temel bir sorun için, daha basit bir lambda tasarımı işlev nesnesi tasarımından genellikle daha iyi bir tasarımdır. Ancak ilerde işlevsellik için önemli bir genişletme gerekeceğini düşünüyorsanız, kodu korumayı kolaylaştıracak işlev nesnesi tasarımını kullanabilirsiniz.

operator() hakkında daha fazla bilgi için bkz. İşlev Çağrısı. for_each işlevi hakkında daha fazla bilgi için bkz. for_each.

Kod

// even_functor.cpp
// compile with: /EHsc
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

class FunctorClass
{
public:
    // The required constructor for this example.
    explicit FunctorClass(int& evenCount)
        : m_evenCount(evenCount) { }

    // The function-call operator prints whether the number is
    // even or odd. If the number is even, this method updates
    // the counter.
    void operator()(int n) const {
        cout << n;

        if (n % 2 == 0) {
            cout << " is even " << endl;
            ++m_evenCount;
        } else {
            cout << " is odd " << endl;
        }
    }

private:
    // Default assignment operator to silence warning C4512.
    FunctorClass& operator=(const FunctorClass&);

    int& m_evenCount; // the number of even variables in the vector.
};

int main()
{
    // Create a vector object that contains 9 elements.
    vector<int> v;
    for (int i = 1; i < 10; ++i) {
        v.push_back(i);
    }

    // Count the number of even numbers in the vector by
    // using the for_each function and a function object.
    int evenCount = 0;
    for_each(v.begin(), v.end(), FunctorClass(evenCount));

    // Print the count of even numbers to the console.
    cout << "There are " << evenCount
        << " even numbers in the vector." << endl;
}
1 is odd
2 is even
3 is odd
4 is even
5 is odd
6 is even
7 is odd
8 is even
9 is odd
There are 4 even numbers in the vector.

Ayrıca bkz.

Lambda İfadeleri
Lambda İfadeleri Örnekleri
oluşturmak
generate_n
for_each
Özel Durum Belirtimleri (throw)
Derleyici Uyarısı (düzey 1) C4297
Microsoft'a Özel Değiştiriciler