Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makalede, lambda ifadelerinin programlarınızda nasıl kullanılacağı gösterilmektedir. Lambda ifadelerine genel bakış için bkz . Lambda İfadeleri. Lambda ifadesinin yapısı hakkında daha fazla bilgi için bkz . Lambda İfade söz dizimi.
Lambda İfadelerini Bildirme
Örnek 1
Lambda ifadesi yazıldığı için, burada gösterildiği gibi bir değişkene auto veya nesneye function atayabilirsiniz:
// declaring_lambda_expressions1.cpp
// compile with: /EHsc /W4
#include <functional>
#include <iostream>
int main()
{
using namespace std;
// Assign the lambda expression that adds two numbers to an auto variable.
auto f1 = [](int x, int y) { return x + y; };
cout << f1(2, 3) << endl;
// Assign the same lambda expression to a function object.
function<int(int, int)> f2 = [](int x, int y) { return x + y; };
cout << f2(3, 4) << endl;
}
Örnek şu çıkışı oluşturur:
5
7
Açıklamalar
Daha fazla bilgi için bkz auto. , function Sınıf ve İşlev Çağrısı.
Lambda ifadeleri genellikle bir işlevin gövdesinde bildirilir, ancak bir değişkeni başlatabileceğiniz her yerde bunları bildirebilirsiniz.
Örnek 2
Microsoft C++ derleyicisi, ifade çağrıldığında değil, ifade bildirildiğinde yakalanan değişkenlerine bir lambda ifadesi bağlar. Aşağıdaki örnekte yerel değişkeni değere ve yerel i değişkeni j başvuruya göre yakalayan bir lambda ifadesi gösterilmektedir. Lambda ifadesi değere göre yakaladığından i , programda daha sonraki bir sürümün i yeniden atanması ifadenin sonucunu etkilemez. Ancak, lambda ifadesi başvuruya göre yakaladığından j , öğesinin yeniden atanması j ifadenin sonucunu etkiler.
// declaring_lambda_expressions2.cpp
// compile with: /EHsc /W4
#include <functional>
#include <iostream>
int main()
{
using namespace std;
int i = 3;
int j = 5;
// The following lambda expression captures i by value and
// j by reference.
function<int (void)> f = [i, &j] { return i + j; };
// Change the values of i and j.
i = 22;
j = 44;
// Call f and print its result.
cout << f() << endl;
}
Örnek şu çıkışı oluşturur:
47
Lambda İfadelerini Çağırma
Bir lambda ifadeyi sonraki kod parçacığında gösterildiği gibi anında çağırabilirsiniz. İkinci kod parçacığı, gibi find_ifC++ Standart Kitaplığı algoritmalarına bağımsız değişken olarak lambda geçirmeyi gösterir.
Örnek 1
Bu örnek, iki tamsayının toplamını döndüren bir lambda ifadesi bildirir ve ifadeyi ve bağımsız değişkenleriyle 54hemen çağırır:
// calling_lambda_expressions1.cpp
// compile with: /EHsc
#include <iostream>
int main()
{
using namespace std;
int n = [] (int x, int y) { return x + y; }(5, 4);
cout << n << endl;
}
Örnek şu çıkışı oluşturur:
9
Örnek 2
Bu örnek, bir lambda ifadesini işleve find_if bağımsız değişken olarak geçirir. Parametresi çift sayıysa lambda ifadesi döndürür true .
// calling_lambda_expressions2.cpp
// compile with: /EHsc /W4
#include <list>
#include <algorithm>
#include <iostream>
int main()
{
using namespace std;
// Create a list of integers with a few initial elements.
list<int> numbers;
numbers.push_back(13);
numbers.push_back(17);
numbers.push_back(42);
numbers.push_back(46);
numbers.push_back(99);
// Use the find_if function and a lambda expression to find the
// first even number in the list.
const list<int>::const_iterator result =
find_if(numbers.begin(), numbers.end(),[](int n) { return (n % 2) == 0; });
// Print the result.
if (result != numbers.end()) {
cout << "The first even number in the list is " << *result << "." << endl;
} else {
cout << "The list contains no even numbers." << endl;
}
}
Örnek şu çıkışı oluşturur:
The first even number in the list is 42.
Açıklamalar
İşlev hakkında find_if daha fazla bilgi için bkz find_if. . Yaygın algoritmalar gerçekleştiren C++ Standart Kitaplığı işlevleri hakkında daha fazla bilgi için bkz <algorithm>. .
Lambda İfadelerini İç İçe Geçirme
Örnek
Bu örnekte gösterildiği gibi, bir lambda ifadeyi başka bir tanesinin içine yerleştirebilirsiniz. İç lambda ifadesi bağımsız değişkenini 2 ile çarpar ve sonucu döndürür. Dış lambda ifadesi bağımsız değişkeni ile iç lambda ifadesini çağırır ve sonuca 3 ekler.
// nesting_lambda_expressions.cpp
// compile with: /EHsc /W4
#include <iostream>
int main()
{
using namespace std;
// The following lambda expression contains a nested lambda
// expression.
int timestwoplusthree = [](int x) { return [](int y) { return y * 2; }(x) + 3; }(5);
// Print the result.
cout << timestwoplusthree << endl;
}
Örnek şu çıkışı oluşturur:
13
Açıklamalar
Bu örnekte iç [](int y) { return y * 2; } içe lambda ifadesi verilmiştir.
Daha Yüksek Sıralı Lambda İşlevleri
Örnek
Birçok programlama dili, daha yüksek sıralı bir işlev kavramını destekler. Daha yüksek sıralı bir işlev, bağımsız değişkeni olarak başka bir lambda ifadesi alan veya bir lambda ifadesi döndüren bir lambda ifadesidir. sınıfını function kullanarak C++ lambda ifadesinin daha yüksek sıralı bir işlev gibi davranmasını sağlayabilirsiniz. Aşağıdaki örnekte, bir nesneyi döndüren bir function lambda ifadesi ve bağımsız değişkeni olarak nesne alan bir function lambda ifadesi gösterilmektedir.
// higher_order_lambda_expression.cpp
// compile with: /EHsc /W4
#include <iostream>
#include <functional>
int main()
{
using namespace std;
// The following code declares a lambda expression that returns
// another lambda expression that adds two numbers.
// The returned lambda expression captures parameter x by value.
auto addtwointegers = [](int x) -> function<int(int)> {
return [=](int y) { return x + y; };
};
// The following code declares a lambda expression that takes another
// lambda expression as its argument.
// The lambda expression applies the argument z to the function f
// and multiplies by 2.
auto higherorder = [](const function<int(int)>& f, int z) {
return f(z) * 2;
};
// Call the lambda expression that is bound to higherorder.
auto answer = higherorder(addtwointegers(7), 8);
// Print the result, which is (7+8)*2.
cout << answer << endl;
}
Örnek şu çıkışı oluşturur:
30
İşlevde Lambda İfadesi Kullanma
Örnek
Bir işlevin gövdesinde lambda ifadeleri kullanabilirsiniz. Lambda ifadesi, kapsayan işlevin erişebileceği herhangi bir işleve veya veri üyesine erişebilir. kapsayan sınıfın this işlevlerine ve veri üyelerine erişim sağlamak için işaretçiyi açıkça veya örtük olarak yakalayabilirsiniz.
Visual Studio 2017 sürüm 15.3 ve üzeri (ve üzeri ile /std:c++17 kullanılabilir): Lambda, özgün nesne kapsam dışına çıktıktan sonra kodun yürütülebileceği zaman uyumsuz veya paralel işlemlerde kullanılıp kullanılmayacağını () değere görethis yakalayın[*this].
İşaretçiyi this burada gösterildiği gibi bir işlevde açıkça kullanabilirsiniz:
// capture "this" by reference
void ApplyScale(const vector<int>& v) const
{
for_each(v.begin(), v.end(),
[this](int n) { cout << n * _scale << endl; });
}
// capture "this" by value (Visual Studio 2017 version 15.3 and later)
void ApplyScale2(const vector<int>& v) const
{
for_each(v.begin(), v.end(),
[*this](int n) { cout << n * _scale << endl; });
}
İşaretçiyi this örtük olarak da yakalayabilirsiniz:
void ApplyScale(const vector<int>& v) const
{
for_each(v.begin(), v.end(),
[=](int n) { cout << n * _scale << endl; });
}
Aşağıdaki örnekte, bir ölçek değerini kapsülleyen sınıfı gösterilmektedir Scale .
// function_lambda_expression.cpp
// compile with: /EHsc /W4
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
class Scale
{
public:
// The constructor.
explicit Scale(int scale) : _scale(scale) {}
// Prints the product of each element in a vector object
// and the scale value to the console.
void ApplyScale(const vector<int>& v) const
{
for_each(v.begin(), v.end(), [=](int n) { cout << n * _scale << endl; });
}
private:
int _scale;
};
int main()
{
vector<int> values;
values.push_back(1);
values.push_back(2);
values.push_back(3);
values.push_back(4);
// Create a Scale object that scales elements by 3 and apply
// it to the vector object. doesn't modify the vector.
Scale s(3);
s.ApplyScale(values);
}
Örnek şu çıkışı oluşturur:
3
6
9
12
Açıklamalar
işlevi, ApplyScale ölçek değerinin çarpımını ve bir nesnedeki her öğeyi yazdırmak için bir vector lambda ifadesi kullanır. Lambda ifadesi, üyeye erişebilmesi this için örtük olarak yakalar_scale.
Şablonlarla Lambda İfadelerini Kullanma
Örnek
Lambda ifadeleri yazıldığından, bunları C++ şablonlarıyla birlikte kullanabilirsiniz. Aşağıdaki örnekte ve negate_all işlevleri gösterilmektedirprint_all. işlevi, negate_all nesnedeki her öğeye birli'yi operator-vector uygular. işlevi nesnedeki print_allvector her öğeyi konsola yazdırır.
// template_lambda_expression.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
// Negates each element in the vector object. Assumes signed data type.
template <typename T>
void negate_all(vector<T>& v)
{
for_each(v.begin(), v.end(), [](T& n) { n = -n; });
}
// Prints to the console each element in the vector object.
template <typename T>
void print_all(const vector<T>& v)
{
for_each(v.begin(), v.end(), [](const T& n) { cout << n << endl; });
}
int main()
{
// Create a vector of signed integers with a few elements.
vector<int> v;
v.push_back(34);
v.push_back(-43);
v.push_back(56);
print_all(v);
negate_all(v);
cout << "After negate_all():" << endl;
print_all(v);
}
Örnek şu çıkışı oluşturur:
34
-43
56
After negate_all():
-34
43
-56
Açıklamalar
C++ şablonları hakkında daha fazla bilgi için bkz . Şablonlar.
Özel Durumları İşleme
Örnek
Bir lambda ifadesinin gövdesi, hem yapısal özel durum işleme (SEH) hem de C++ özel durum işleme kurallarına uyar. Harekete geçirilmiş bir özel bir durumu, lambda ifadesinin gövdesi içinde işleyebilir veya özel durum işlemesini kapsayan kapsama erteleyebilirsiniz. Aşağıdaki örnek, bir nesneyi başka bir for_each nesnenin vector değerleriyle doldurmak için işlevini ve lambda ifadesini kullanır. İlk vektöre geçersiz erişimi işlemek için bir try/catch blok kullanır.
// eh_lambda_expression.cpp
// compile with: /EHsc /W4
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
// Create a vector that contains 3 elements.
vector<int> elements(3);
// Create another vector that contains index values.
vector<int> indices(3);
indices[0] = 0;
indices[-1] = 1; // This is not a valid subscript. It will trigger an exception.
indices[2] = 2;
// Use the values from the vector of index values to
// fill the elements vector. This example uses a
// try/catch block to handle invalid access to the
// elements vector.
try
{
for_each(indices.begin(), indices.end(), [&](int index) {
elements.at(index) = index;
});
}
catch (const out_of_range& e)
{
cerr << "Caught '" << e.what() << "'." << endl;
};
}
Örnek şu çıkışı oluşturur:
Caught 'invalid vector<T> subscript'.
Açıklamalar
Özel durum işleme hakkında daha fazla bilgi için bkz . Özel Durum İşleme.
Yönetilen Türlerle Lambda İfadelerini Kullanma (C++/CLI)
Örnek
Lambda ifadesinin capture yan tümcesi, yönetilen türe sahip bir değişken içeremez. Ancak, lambda ifadesi parametre listesine, yönetilen bir türe sahip bir bağımsız değişken geçirebilirsiniz. Aşağıdaki örnek, yerel yönetilmeyen değişkeni ch değere göre yakalayan ve parametresi olarak bir nesne alan bir System.String lambda ifadesi içerir.
// managed_lambda_expression.cpp
// compile with: /clr
using namespace System;
int main()
{
char ch = '!'; // a local unmanaged variable
// The following lambda expression captures local variables
// by value and takes a managed String object as its parameter.
[=](String ^s) {
Console::WriteLine(s + Convert::ToChar(ch));
}("Hello");
}
Örnek şu çıkışı oluşturur:
Hello!
Açıklamalar
STL/CLR kitaplığı ile lambda ifadeleri de kullanabilirsiniz. Daha fazla bilgi için bkz . STL/CLR Kitaplık Başvurusu.
Önemli
Lambdalar şu ortak dil çalışma zamanı (CLR) yönetilen varlıklarında desteklenmez: ref class, ref struct, value classve value struct.
Ayrıca bkz.
Lambda İfadeleri
Lambda İfadesi Söz Dizimi
auto
function Sınıf
find_if
<algorithm>
İşlev Çağrısı
Şablonlar
Özel Durum İşleme
STL/CLR Kitaplık Başvurusu