Expressões lambda C++
Em Visual C++, um método conhecido como expressão- à lambda- écomo uma função anônimo que mantém o estado e pode acessar as variáveis que estão disponíveis para o escopo delimitador.Este artigo define o que são compara-os os lambdas, a outras técnicas de programação, descreve-o suas vantagens, e fornece um exemplo básico.
Sobre Lambdas
Muitas linguagens de programação suportam o conceito de uma função anônimo, que é uma função que tem um corpo, mas não têm um nome.Um lambda é uma técnica de programação que está relacionada às funções anônimos.Um método implicitamente define uma classe de objeto de função e constrói um objeto de função do tipo de classe.Para obter mais informações sobre objetos de função Objetos de função, consulte.
Importante |
---|
Lambdas não são suportadas nas seguintes entidades gerenciadas do common language runtime (CLR): ref class, ref struct, value class, ou value struct. |
Objetos de função CONTRA. Lambdas
Quando você escreve o código, você provavelmente usa ponteiros de função e objetos de função para resolver problemas e executar cálculos, especialmente quando você usa Algoritmos de STL.Ponteiros de função e objetos de função têm vantagens e desvantagem- por exemplo, ponteiros de função tem a sobrecarga sintática mínima mas não manter o estado em um escopo, e objetos de função podem manter o estado mas a sobrecarga exigir sintática de uma definição de classe.
Um lambda combina os benefícios de ponteiros de função e objetos de função e evita as desvantagens.Como uma função objetos, um método é flexível e pode manter o estado, mas diferentemente de um objeto de função, sua sintaxe compacta não requer uma definição de classe.Usando lambdas, você pode escrever código que é erros e menos complicada menos inclinados do código para um objeto equivalente de função.
Os exemplos a seguir comparam o uso de um método ao uso de um objeto de função.O primeiro exemplo usa um método para imprimir no console se cada elemento em um objeto de vector é uniforme ou ímpar.O segundo exemplo usa um objeto de função para fazer a mesma tarefa.
Exemplo 1: Usando um Lambda
Este exemplo usa um método que está inserido na chamada de função de for_each para imprimir no console se cada elemento em um objeto de vector é uniforme ou ímpar.
Código
// 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;
}
Saída
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.
Comentários
No exemplo, o terceiro argumentos à função de for_each é um método.A parte de [&evenCount] especifica a cláusula catch de expressão, (int n) especifica a lista de parâmetros, e a parte remanescente especifique o corpo da expressão.
Exemplo 2: Usando um objeto de função
Às vezes um método seria muito incómodo estender muito mais fora do exemplo anterior.O exemplo a seguir usa um objeto de função em vez de um método, juntamente com a função de for_each , para gerar os mesmos resultados que o exemplo 1.Dois exemplos armazenam a mesma contagem de números em um objeto de vector .Para manter o estado da operação, a classe de FunctorClass armazena a variável de m_evenCount por referência como um variável de membro.Para executar a operação, FunctorClass implementa o operador de chamada de função, operator().O compilador do Visual C++ gera código que é comparável tamanho e desempenho no código lambda no exemplo 1.Para um problema como básico de aquele neste artigo, o design mais simples lambda provavelmente é melhor do que o design de gerenciamento de função objeto.No entanto, se você acha que a funcionalidade pode exigir a expansão significativa no futuro, então use um design do objeto da função de modo que a manutenção de código é mais fácil.
Para obter mais informações sobre, consulte operator()Chamada de função (C++).Para obter mais informações sobre a função de for_each , consulte for_each.
Código
// 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;
}
Resumo
Lambdas é uma técnica de programação avançada e completo expressive.Para aprender sobre as partes e as propriedades de um método, consulte Sintaxe de expressões lambda.Para saber como usar lambdas em seus programas, consulte Exemplos de expressões Lambda.