Lambda ifadeleri C++
Visual c++, lambda ifadesi — adı verilen bir lambda— durumunu koruyan anonim bir işlevi gibi ve kapsayan kapsama değişkenler erişebilirsiniz. Bu makalede lambda neler olduğunu tanımlar, bunları diğer programlama teknikleri için karşılaştırır, kendi yararları anlatılmaktadır ve temel bir örnek sağlar.
Lambda hakkında
Kavramı çoğu programlama dili destekleyen bir Anonim işlev, bir gövdeye sahip ancak bir isme sahip bir işlevi olduğu. Bir lambda anonim işlevler ilişkili bir programlama tekniğidir. Örtülü olarak bir lambda işlevi nesne sınıfı tanımlar ve bir sınıf türü işlev nesnesi oluşturur. Function nesneleri hakkında daha fazla bilgi için bkz: Function nesneleri.
Önemli
Lambda aşağıdaki ortak dil çalışma zamanı (clr) yönetilen varlıklar içinde desteklenmez: ref class, ref struct, value class, veya value struct.
İşlev nesneleri vs. lambda
Kod yazarken, büyük olasılıkla işlev işaretçileri ve işlev nesneleri özellikle kullandığınızda, hesaplamalar ve sorunları çözmek için kullandığınız stl algoritmaları. İşlev işaretçileri ve işlev nesnelerinin avantajları ve dezavantajları vardır — Örneğin, işlev işaretçileri sözdizimsel az yük var ancak bir kapsam içinde durumu içermez ve function nesneleri durumunu korumak ancak bir sınıf tanımı sözdizimsel yükü gerektirir.
Bir lambda işlev işaretçileri ve function nesneleri birleştirir ve kendi dezavantajları önler. Bir işlev nesneleri gibi bir lambda esnektir ve durumu saklayabilirsiniz, ancak işlevi nesneyi farklı olarak, bir sınıf tanımı, kısaltılmış sözdizimi gerektirmez. Lambda kullanarak daha hantal ve daha az hatalar eşdeğer işlev nesnesi için kod daha açıktır kod yazabilirsiniz.
Aşağıdaki örnekler bir lambda işlevi nesne kullanımı için kullanımını karşılaştırın. İlk örnek bir lambda konsola yazdırmak için kullanılır olup olmadığını her öğe, bir vector çift veya tek nesne. İkinci örnek aynı görevi başarmak için bir işlev nesnesini kullanır.
Örnek 1: bir Lambda kullanma
Bu örnek kullanır gömülü olan lambda for_each işlev çağrısında konsola yazdırmak için olup olmadığını her öğe, bir vector nesnesini çift veya tek.
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 10 elements.
vector<int> v;
for (int i = 0; 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;
}
Çıktı
0 is even
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 5 even numbers in the vector.
Comments
Örnekte, üçüncü bağımsız değişken için for_each lambda bir işlevdir. [&evenCount] Bölümü belirtir deyimin yakalama yan (int n) parametre listesi ve kalan bölümü ifade gövdesi belirtir.
Örnek 2: bir işlev nesnesi kullanma
Bazen bir lambda önceki örnekte çok daha genişletmek için bloklarıyla olacaktır. Sonraki örnek ile birlikte bir lambda yerine bir işlev nesnesi kullanan for_each örnek 1 olarak aynı sonuçları elde etmek için işlev. Örneklerin her ikisi de çift sayıların sayısı saklamak bir vector nesne. İşlemin durumunu korumak için FunctorClass sınıf mağazalar m_evenCount tarafından başvuru olarak bir üye değişkeni değişken. İşlemi gerçekleştirmek için FunctorClass işlev çağrısı işlecini uygulayan operator(). Visual c++ derleyicisi boyutu ve performans örnek 1'deki lambda koda benzer kodu üretir. Bu makalede bir gibi temel bir sorun daha basit lambda tasarım işlevi nesne Tasarım'dan büyük olasılıkla daha iyi olur. Gelecekte önemli genişletme işlevi gerekebilir düşünüyorsanız, böylece kod Bakımı daha kolay olacaktır ancak, sonra işlev nesne tasarımı kullanın.
operator() hakkında daha fazla bilgi için, bkz. İşlev çağrısı (C++). Hakkında daha fazla bilgi için for_each çalışması 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 10 elements.
vector<int> v;
for (int i = 0; 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;
}
Özet
Lambda güçlü ve etkileyici bir programlama tekniği olan. Parça ve bir lambda özellikleri hakkında bilgi edinmek için Lambda ifade sözdizimi. Lambda programlarınızda kullanmayı öğrenmek için bkz: Lambda ifade örnekleri.