Compartilhar via


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.

Observação importanteImportante

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.

Dd293608.collapse_all(pt-br,VS.110).gifCó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;
}

Dd293608.collapse_all(pt-br,VS.110).gifSaí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.

Dd293608.collapse_all(pt-br,VS.110).gifComentá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.

Dd293608.collapse_all(pt-br,VS.110).gifCó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.

Consulte também

Referência

Chamada de função (C++)

for_each

Conceitos

Objetos de função

Outros recursos

Referência de linguagem C++